PHP用户注册与登录系统开发:常见陷阱与安全实践

PHP用户注册与登录系统开发:常见陷阱与安全实践

本教程深入探讨%ignore_a_1%用户注册与登录系统开发中的常见问题,包括变量名冲突导致的数据存储错误、不安全的密码处理方式以及不规范的页面重定向。文章将提供详细的解决方案,涵盖使用预处理语句防止sql注入、实现安全的密码哈希存储与验证、以及采用正确的服务器端重定向机制,旨在帮助开发者构建健壮且安全的php用户管理系统。

在构建基于PHP的Web应用程序时,用户注册和登录功能是核心组成部分。然而,在实现这些功能时,开发者常常会遇到一些常见问题,例如变量名冲突、数据存储不安全以及页面重定向处理不当。本教程将针对这些问题,提供一套系统性的分析和解决方案,以帮助您构建一个更加安全和健壮的用户管理系统。

1. 核心问题分析与解决方案

1.1 变量名冲突导致的数据存储错误

问题描述:当在同一个作用域内,数据库连接参数的变量名与用户提交的表单数据变量名相同,并且数据库连接文件在处理用户输入的脚本之后被引入时,用户输入的数据可能会被数据库连接参数覆盖。这将导致数据库中存储的不是用户实际输入的信息,而是数据库的登录凭据。

例如,在原始的 signupp.php 文件中:


而 db.php 文件包含:


当 db.php 被 require_once 引入时,$username 和 $password 这两个变量会被 root 和 password 覆盖,导致 createUser 函数接收到的是数据库的凭据而不是用户的注册信息。

立即学习“PHP免费学习笔记(深入)”;

解决方案:确保用户提交的表单数据变量名与数据库连接参数的变量名不冲突。最直接的方法是使用不同的变量名。

signupp.php 修正示例:


functions.php 中 createUser 函数的参数名也应与传入的变量保持一致:


这样,createUser 函数内部使用的 $name, $email, $username, $password 将正确地引用用户提交的数据。

1.2 不安全的密码处理与验证

问题描述:在用户管理系统中,直接存储明文密码或采用不安全的密码验证方式是严重的安全漏洞。原始代码在 createUser 中使用了 password_hash,这是一个良好的实践,但在 loginUser 中却存在严重问题:

// functions.php 中原始的 loginUser 函数片段function loginUser($conn, $userme, $passme) {    $passHashed = ["passme"]; // 错误:这里不应该直接赋值字符串数组    $checkPwd = password_verify($passme, "passme"); // 错误:不应该与硬编码字符串比较    if ($checkPwd === false) {        // ...    } else if ($checkPwd === true) {        // ...    }}

loginUser 函数中的 $passHashed = [“passme”]; 和 password_verify($passme, “passme”); 是完全错误的。password_verify 函数的第二个参数应该是从数据库中获取到的用户注册时存储的哈希密码,而不是一个硬编码的字符串。

解决方案:

注册时: 始终使用 password_hash() 函数对用户密码进行哈希处理,并将哈希值存储到数据库中。登录时:首先根据用户提供的用户名从数据库中检索出对应的哈希密码。然后使用 password_verify() 函数将用户输入的明文密码与从数据库中获取的哈希密码进行比较。

functions.php 修正示例:


注意: 数据库中存储密码的字段类型应足够长,以存储 password_hash 生成的哈希值(通常为 VARCHAR(255))。

1.3 不规范的页面重定向与错误处理

问题描述:原始代码中混合使用了 header(“location: …”) 和 echo “window.location.href=’…'”; 进行页面重定向。

header(“location: …”) 是服务器端重定向,它通过HTTP响应头告诉浏览器跳转到新的URL。在执行 header() 后,务必使用 exit() 或 die() 终止脚本执行,以防止后续代码被意外执行。echo “window.location.href=’…'”; 是客户端JavaScript重定向,它依赖于浏览器执行JavaScript。这种方式在某些情况下可能被禁用或出现延迟,并且在处理POST请求后,如果用户禁用JavaScript,可能无法正确重定向。此外,在PHP脚本中直接输出HTML和JavaScript代码来控制流程,通常被认为是不够优雅且难以维护的。

解决方案:在PHP中,对于服务器端重定向,应统一使用 header(“location: …”) 配合 exit()。

signupp.php 修正示例:


functions.php 中 createUser 成功后的重定向:


2. 代码结构优化与最佳实践

除了上述核心问题,以下是一些关于代码结构和最佳实践的建议:

2.1 避免在HTML页面中直接 include 完整的HTML结构

在 signup.php 或 login.php 中直接 include_once ‘index.php’; 是一个不好的实践。index.php 包含了完整的 html>,

, 标签。将其包含到另一个也输出HTML的页面中会导致无效的HTML结构(例如,多个 或 标签)。

推荐做法:使用独立的页眉(header)和页脚(footer)文件,例如 header.php 和 footer.php,它们分别包含HTML文档的开始和结束部分,以及共享的导航或样式链接。

header.php 示例:

    PHP Login System                body { font: 1em sans-serif; }            

Welcome

footer.php 示例:

    

© 2023 My PHP Shop

signup.php 示例:

Sign Up

2.2 数据库连接的安全性与错误处理

db.php 文件中的数据库连接信息应妥善保管,避免泄露。对于生产环境,不建议将数据库凭据直接硬编码在文件中,可以考虑使用环境变量或配置文件。

db.php 示例:


2.3 SQL 注入防护(预处理语句)

原始代码在 createUser 和 loginUser 中使用了 mysqli_stmt_init 和 mysqli_stmt_prepare,这是非常好的实践,可以有效防止SQL注入攻击。务必确保所有与用户输入交互的数据库操作都使用预处理语句。

3. 完整示例代码(关键文件修订)

基于上述分析和建议,以下是关键文件的修订版本:

db.php


functions.php

<?phpfunction createUser($conn, $name, $email, $username, $password) {    $sql = "INSERT INTO GuestsLogs (namee, emaill, userme, passme) VALUES (?, ?, ?, ?);";    $stmt = mysqli_stmt_init($conn);    if (!mysqli_stmt_prepare($stmt, $sql)) {        header("location: signup.php?error=stmtfailed");        exit();    }    $hashedPwd = password_hash($password, PASSWORD_DEFAULT); // 对密码进行哈希    mysqli_stmt_bind_param($stmt, "ssss", $name, $email, $username, $hashedPwd);    mysqli_stmt_execute($stmt);    mysqli_stmt_close($stmt);    header("location: signup.php?signup=success"); // 注册成功后重定向    exit();}function loginUser($conn, $username_input, $password_input) {    $sql = "SELECT * FROM GuestsLogs WHERE userme = ?;";    $stmt = mysqli_stmt_init($conn);    if (!mysqli_stmt_prepare($stmt, $sql)) {        header("location: login.php?error=stmtfailed");        exit();    }    mysqli_stmt_bind_param($stmt, "s", $username_input);    mysqli_stmt_execute($stmt);    $resultData = mysqli_stmt_get_result($stmt);    if ($row = mysqli_fetch_assoc($resultData)) {        $hashedPwd = $row["passme"]; // 从数据库获取哈希密码        $checkPwd = password_verify($password_input, $hashedPwd); // 验证密码        if ($checkPwd === false) {            header("location: login.php?error=wronglogin");            exit();        } else if ($checkPwd === true) {            session_start();            $_SESSION["userid"] = $row["id"]; // 假设有用户ID            $_SESSION["userme"] = $row["userme"];            header("location: index.php");            exit();        }    } else {        header("location: login.php?error=wronglogin"); // 用户不存在或密码错误        exit();    }    mysqli_stmt_close($stmt);}

signupp.php


loginn.php


header.php (作为公共头部)

    PHP Login System                body { font: 1em sans-serif; }        nav a { margin-right: 15px; }            

PHP Login System

footer.php (作为公共底部)

    

© My PHP Shop

index.php

    

Welcome to the home page!

<?php if (isset($_SESSION["userme"])) { echo "

Hello, " . $_SESSION["userme"] . "!

"; } else

以上就是PHP用户注册与登录系统开发:常见陷阱与安全实践的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1334223.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP中安全计算百分比:处理空值、零值与字符串小数
上一篇 2025年12月12日 20:07:04
基于.htaccess的浏览器语言检测与多语言URL重写实践指南
下一篇 2025年12月12日 20:07:10

相关推荐

  • 360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案

    360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案

    首先优化内存与缓存设置,启用自动释放内存和清理缓存功能;其次使用浏览器内置的一键修复工具扫描并修复异常;若问题依旧,建议卸载后重新安装最新版浏览器;最后可借助360安全卫士等第三方工具进行系统级修复,排除插件冲突或组件损坏问题。 如果您在使用360极速浏览器时遇到“喔唷,崩溃啦”的提示,这通常意味着…

    2026年9月28日 • 用户投稿
    300
  • sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法

    sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法

    安装插件并配置可实现Sublime Text保存时自动格式化代码,提升代码可读性与一致性。首先安装Package Control包管理器,通过控制台执行指定代码完成安装;重启后使用命令面板(Ctrl+Shift+P)调出Package Control: Install Package,搜索并安装所需…

    2026年9月28日 • 用户投稿
    700
  • 建立MySQL中买菜系统的配送区域表

    建立MySQL中买菜系统的配送区域表建立MySQL中买菜系统的配送区域表建立MySQL中买菜系统的配送区域表建立MySQL中买菜系统的配送区域表

    建立MySQL中买菜系统的配送区域表,需要具体代码示例 在买菜系统中,配送区域是一个重要的信息,它决定了哪些地区能够享受到买菜配送服务。为了方便管理和查询,我们可以在MySQL数据库中建立配送区域表。 首先,我们需要为配送区域表确定一些基本的字段,例如区域名称、省份、城市、区、详细地址等。接下来,我…

    2026年9月28日 • 用户投稿
    000
  • 百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法

    百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法

    1、可通过设置菜单退出当前账号后登录新账号实现切换;2、安卓用户可使用应用分身功能创建百度App双开实例,分别登录不同账号;3、符合条件的iOS设备可利用巨魔商店安装修改版百度App实现多开,从而同时登录多个账号。 如果您需要在百度搜索App中频繁使用不同的账号进行登录,但每次都需要退出再重新登录,…

    2026年9月28日 • 用户投稿
    1100
  • 360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法

    360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法

    首先更改360极速浏览器默认下载工具以调用第三方下载软件。进入设置页面的下载设置选项,选择“选择默认下载工具”并从下拉列表中选取已安装的工具如迅雷或IDM;若未显示目标工具,可选“自定义”或“浏览”,手动定位其.exe主程序文件完成关联;最后通过点击网页下载链接验证是否成功调起第三方工具,确保设置生…

    2026年9月28日 • 用户投稿
    400
  • MySQL 实现点餐系统的预定功能

    MySQL 实现点餐系统的预定功能MySQL 实现点餐系统的预定功能MySQL 实现点餐系统的预定功能MySQL 实现点餐系统的预定功能

    MySQL 实现点餐系统的预定功能,需要具体代码示例 随着科技的进步和人们生活节奏的加快,越来越多的人选择通过点餐系统进行餐厅预订,这一功能已经成为现代餐饮行业的标配。本文将介绍如何使用MySQL数据库实现一个简单的点餐系统的预定功能,并提供具体的代码示例。 在设计点餐系统的预定功能时,我们首先需要…

    2026年9月28日 • 用户投稿
    000
  • sublime如何安装主题_Sublime主题安装与切换教程

    sublime如何安装主题_Sublime主题安装与切换教程sublime如何安装主题_Sublime主题安装与切换教程sublime如何安装主题_Sublime主题安装与切换教程sublime如何安装主题_Sublime主题安装与切换教程

    首先安装Package Control,再通过命令面板搜索并安装如Material Theme等主题,最后在设置中配置theme和color_scheme选项启用,也可通过UI: Select Theme快速切换,推荐尝试One Dark、AYU等风格以提升编码体验。 Sublime Text 是一…

    2026年9月28日 • 用户投稿
    000
  • Kook电脑版官方入口 _ KOOK网页版在线登录平台

    Kook电脑版官方入口 _ KOOK网页版在线登录平台Kook电脑版官方入口 _ KOOK网页版在线登录平台Kook电脑版官方入口 _ KOOK网页版在线登录平台Kook电脑版官方入口 _ KOOK网页版在线登录平台

    KOOK电脑版官方入口是https://www.kookapp.cn/,提供稳定语音通话、文字聊天、文件传输等功能,支持跨设备同步与社区互动。 KOOK电脑版官方入口在哪里?这是许多用户都在寻找的信息,接下来由PHP小编为大家带来KOOK电脑版及网页版的在线登录平台地址,想了解这个平台特点的朋友,一…

    2026年9月28日 • 用户投稿
    100
  • 如何在MySQL中创建买菜系统的支付记录表

    如何在MySQL中创建买菜系统的支付记录表如何在MySQL中创建买菜系统的支付记录表如何在MySQL中创建买菜系统的支付记录表如何在MySQL中创建买菜系统的支付记录表

    在MySQL中创建买菜系统的支付记录表是购物网站必不可少的功能。这个表主要用于存储用户在购物系统中的支付信息,包括支付金额、支付时间、订单号等。以下是如何在MySQL中创建买菜系统的支付记录表的具体代码示例: CREATE TABLE `payment_record` ( `id` int(11) …

    2026年9月28日 • 用户投稿
    100
  • KOOK官方下载中心 _ Kook语音网页版账号登录

    KOOK官方下载中心 _ Kook语音网页版账号登录KOOK官方下载中心 _ Kook语音网页版账号登录KOOK官方下载中心 _ Kook语音网页版账号登录KOOK官方下载中心 _ Kook语音网页版账号登录

    KOOK官方下载中心位于其官网https://www.kookapp.cn/,提供桌面端、移动端及网页版登录方式;平台支持多模式语音频道、文字互动、机器人接入及屏幕共享功能;客户端覆盖Windows、macOS与主流手机系统,具备低延迟、低资源占用与多端消息同步优势;网页版无需下载,兼容主流浏览器,…

    2026年9月28日 • 用户投稿
    000
  • 对于内容创作者而言,多核性能与高频率哪个才是更关键的选择指标?

    视频创作者优先多核以提升渲染效率,图形设计和实时操作则依赖高频率保证流畅性,直播等多任务场景需平衡二者,最终选择应基于主要工作负载。 对于内容创作者来说,多核性能和高频率哪个更重要,取决于具体的创作类型和使用场景。没有绝对的答案,但可以根据工作负载的特点做出更合理的选择。 视频剪辑与渲染:多核性能优…

    2026年9月28日
    100
  • 吴泳铭掌舵两年,阿里AI起飞

    吴泳铭掌舵两年,阿里AI起飞吴泳铭掌舵两年,阿里AI起飞吴泳铭掌舵两年,阿里AI起飞吴泳铭掌舵两年,阿里AI起飞

    9 月 24 日下午,云栖小镇 d2-9 场馆,一场以 1688 ai 为主题的论坛开场。场馆面积不小,但将近 3 小时的分享,座位早早被占满,后排空地也被人群挤得寸步难行。 热度不仅限于这一场。 不论是在硬核技术主题论坛,还是充满机器人、汽车的应用馆,四处人头攒动。 一位连续多年参会的从业者笑言:…

    2026年9月28日 • 用户投稿
    000
  • 使用云 Firestore 在服务器端处理数据以优化 Android 应用性能

    正如前文摘要所述,本文将介绍如何将 Android 应用中 Cloud Firestore 的数据处理逻辑迁移至服务器端,从而提高应用的性能和可维护性。 在 Android 应用开发中,直接在客户端执行大量的 Firestore CRUD(创建、读取、更新、删除)操作可能会导致应用运行缓慢,并且代码…

    2026年9月28日
    400
  • x浏览器账号无法登录是什么情况_x浏览器账户登录失败原因与对策

    x浏览器账号无法登录是什么情况_x浏览器账户登录失败原因与对策x浏览器账号无法登录是什么情况_x浏览器账户登录失败原因与对策x浏览器账号无法登录是什么情况_x浏览器账户登录失败原因与对策x浏览器账号无法登录是什么情况_x浏览器账户登录失败原因与对策

    首先检查网络连接是否正常,确认Wi-Fi或移动数据可访问互联网;其次核对账号密码输入是否准确,注意大小写和空格;若仍无法登录,清除x浏览器应用缓存与数据后重启;确保浏览器已更新至最新版本,避免因版本过旧导致兼容问题;最后排查服务器状态及地区限制,查看官方公告或联系客服解决。 如果您在尝试登录x浏览器…

    2026年9月28日 • 用户投稿
    000
  • MySQL如何使用外键约束删除 级联删除与SET NULL策略

    MySQL如何使用外键约束删除 级联删除与SET NULL策略MySQL如何使用外键约束删除 级联删除与SET NULL策略MySQL如何使用外键约束删除 级联删除与SET NULL策略MySQL如何使用外键约束删除 级联删除与SET NULL策略

    外键约束在mysql中用于维护数据完整性,级联删除和set null是两种处理删除操作的策略。1. 创建父表并定义主键;2. 创建子表时通过foreign key指定外键,并使用on delete cascade或on delete set null设定删除策略;3. 插入测试数据验证约束效果;4.…

    2026年9月28日 • 用户投稿
    000
  • AO3中文网页版应用下载通道 AO3中文网页版登录直达v1.5

    AO3中文网页版应用下载通道 AO3中文网页版登录直达v1.5AO3中文网页版应用下载通道 AO3中文网页版登录直达v1.5AO3中文网页版应用下载通道 AO3中文网页版登录直达v1.5AO3中文网页版应用下载通道 AO3中文网页版登录直达v1.5

    AO3中文网页版无需下载应用,直接访问官网archiveofourown.org,通过右上角“About”→“FAQ”切换中文界面,注册登录后即可浏览、评论、收藏,支持多维度分类检索与个性化标签筛选,提供流畅的跨设备阅读体验。 AO3中文网页版应用下载通道在哪里?这是不少网友都关注的,接下来由PHP…

    2026年9月28日 • 用户投稿
    000
  • 抖音怎么在电脑上直播?抖音不够1000粉丝怎么开橱窗

    抖音怎么在电脑上直播?抖音不够1000粉丝怎么开橱窗抖音怎么在电脑上直播?抖音不够1000粉丝怎么开橱窗抖音怎么在电脑上直播?抖音不够1000粉丝怎么开橱窗抖音怎么在电脑上直播?抖音不够1000粉丝怎么开橱窗

    随着抖音的火爆,越来越多的人想要在电脑上直播,分享自己的生活和才艺。但是,电脑上如何进行抖音直播呢?别急,今天就来给大家详细讲解一下电脑上抖音直播的步骤和技巧。 一、准备工作 1. 注册抖音账号 在电脑上直播之前,首先需要在抖音APP上注册一个账号。如果还没有账号,可以下载抖音APP进行注册。 2.…

    2026年9月28日 • 用户投稿
    000
  • uc浏览器如何关闭智能拼页功能_UC浏览器关闭网页自动拼接方法

    uc浏览器如何关闭智能拼页功能_UC浏览器关闭网页自动拼接方法uc浏览器如何关闭智能拼页功能_UC浏览器关闭网页自动拼接方法uc浏览器如何关闭智能拼页功能_UC浏览器关闭网页自动拼接方法uc浏览器如何关闭智能拼页功能_UC浏览器关闭网页自动拼接方法

    关闭UC浏览器智能拼页功能可改善阅读体验。首先通过菜单进入设置→浏览设置,关闭“智能拼页”开关;其次在阅读模式下可临时点击“关闭拼页”恢复分页;若选项缺失,建议更新浏览器或清除数据重置设置。 如果您在使用UC浏览器浏览网页时,发现多个网页内容被自动拼接在一起,导致阅读体验受到影响,这可能是智能拼页功…

    2026年9月28日 • 用户投稿
    100
  • sublime终端乱码问题_解决Sublime内置终端中文乱码

    sublime终端乱码问题_解决Sublime内置终端中文乱码sublime终端乱码问题_解决Sublime内置终端中文乱码sublime终端乱码问题_解决Sublime内置终端中文乱码sublime终端乱码问题_解决Sublime内置终端中文乱码

    解决Sublime内置终端中文乱码需统一编码为UTF-8:1. 将文件保存为UTF-8编码;2. 设置Build System的环境变量PYTHONIOENCODING为utf-8;3. 在Windows下通过chcp 65001切换控制台代码页至UTF-8;4. 或使用外部终端运行脚本,避免输出面…

    2026年9月28日 • 用户投稿
    100
  • 如何使用 SSHGUARD 阻止 SSH 暴力攻击

    如何使用 SSHGUARD 阻止 SSH 暴力攻击如何使用 SSHGUARD 阻止 SSH 暴力攻击如何使用 SSHGUARD 阻止 SSH 暴力攻击如何使用 SSHGUARD 阻止 SSH 暴力攻击

    ◆ 概述 sshguard是一个入侵防御实用程序,它可以解析日志并使用系统防火墙自动阻止行为不端的 ip 地址(或其子网)。最初旨在为 openssh 服务提供额外的保护层,sshguard 还保护范围广泛的服务,例如 vsftpd 和 postfix。它可以识别多种日志格式,包括 syslog、s…

    2026年9月28日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信