Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
PHP用户认证系统常见问题与安全实践指南_创想鸟

PHP用户认证系统常见问题与安全实践指南

PHP用户认证系统常见问题与安全实践指南

本文深入探讨了php用户注册与登录系统中常见的错误,包括变量名冲突导致的数据存储异常、不安全的密码处理方式以及不规范的页面重定向问题。通过分析具体代码案例,提供了基于预处理语句、强密码哈希、正确会话管理和优化页面结构的安全实践方案,旨在帮助开发者构建健壮、安全的php认证系统。

在构建PHP用户认证系统时,开发者常常会遇到各种问题,从数据存储异常到安全漏洞。本教程将针对一个典型的PHP注册与登录代码库进行分析,指出其中存在的关键问题,并提供一套更为安全和规范的解决方案。

1. 核心问题识别与分析

原始代码中存在以下几个主要问题:

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

在 signupp.php 文件中,用户提交的表单数据被赋值给了 $name, $email, $username, $password 等变量。随后,db.php 文件被 require_once 引入,而 db.php 中也定义了 $username 和 $password 用于数据库连接。这种变量名冲突导致在 createUser 函数内部,当尝试插入用户数据时,实际上使用了数据库连接的凭据(root, password)而不是用户提交的注册信息,从而导致数据存储错误。

原始 signupp.php 片段:

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

<?phpif (isset($_POST["submit"])) {    $name = $_POST["namee"];    $email = $_POST["emaill"];    $username = $_POST["userme"]; // 用户提交的用户名    $password = $_POST["passme"]; // 用户提交的密码    require_once 'db.php'; // 引入db.php,其中包含 $username="root", $password="password"    require_once 'functions.php';    createUser($conn, $name, $email, $username, $password); // 此时 $username 和 $password 已被 db.php 覆盖}// ...

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

尽管 createUser 函数中使用了 password_hash() 对密码进行哈希处理,但在 loginUser 函数中,密码验证逻辑存在严重缺陷:

$passHashed = [“passme”];:这行代码将 $passHashed 赋值为一个包含字符串 “passme” 的数组,而不是从数据库获取的哈希密码。$checkPwd = password_verify($passme, “passme”);:这里尝试将用户输入的密码与硬编码的字符串 “passme” 进行比较,而不是与存储在数据库中的哈希密码进行比较。这使得登录验证完全失效且不安全。$_SESSION[“userme”] = $passme[“userme”];:在成功登录后,尝试将 $passme[“userme”] 赋给会话变量,这语法是错误的,且不应直接存储原始密码或用户提交的密码到会话中。

原始 functions.php (loginUser) 片段:

<?phpfunction loginUser($conn, $userme, $passme) {    $passHashed = ["passme"]; // 错误:应从数据库获取哈希密码    $checkPwd = password_verify($passme, "passme"); // 错误:应与数据库哈希密码比较    if ($checkPwd === false) {        // ...    }    else if ($checkPwd === true) {        session_start();        $_SESSION["userme"] = $passme["userme"]; // 错误:不应这样设置会话        // ...    }}

1.3 页面结构与重定向问题

HTML结构嵌套: signup.php 和 login.php 文件通过 include_once ‘index.php’; 引入了 index.php。然而,index.php 包含完整的 html>, , 标签。这会导致无效的HTML结构(例如, 标签嵌套在另一个 标签内部),影响浏览器渲染和SEO。重定向方式: 代码中混合使用了 header(“location: …”) 和 echo “window.location.href=’…’;”; 进行页面重定向。虽然两者都能实现重定向,但 header(“Location: …”) 是服务器端重定向的标准方式,应在其后立即调用 exit() 以防止后续代码执行。JavaScript 重定向通常用于客户端逻辑或在HTTP头已发送后进行重定向。

2. 改进方案与代码示例

为了解决上述问题,我们将对代码进行重构和优化。

2.1 数据库连接 (db.php)

db.php 文件保持不变,但需注意其变量名不应与处理用户输入时使用的变量名冲突。


2.2 用户注册处理 (signupp.php)

修改 signupp.php 以确保用户输入变量名与数据库连接变量名不冲突,并使用 header() 进行重定向。


2.3 核心业务逻辑 (functions.php)

重构 createUser 和 loginUser 函数,确保密码安全哈希、正确验证以及预处理语句的使用。


2.4 登录处理 (loginn.php)

与 signupp.php 类似,确保变量名不冲突并使用 header() 重定向。


2.5 页面结构 (index.php, signup.php, login.php)

为了避免HTML结构嵌套问题,建议将 index.php 视为应用程序的主入口或一个独立的页面,而 signup.php 和 login.php 则直接包含表单内容,不应再 include_once ‘index.php’;。如果需要共享导航或页脚,应创建单独的 header.php 和 footer.php 文件。

index.php (示例):

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

Welcome to the PHP Login System

This is the home page content.

signup.php (示例):

    Sign Up                body { font: 1em sans-serif; }        .form-container { max-width: 400px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 5px; }        .form-container input[type="text"], .form-container input[type="email"], .form-container input[type="password"] {            width: calc(100% - 22px); padding: 10px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 3px;        }        .form-container button { width: 100%; padding: 10px; background-color: #007bff; color: white; border: none; border-radius: 3px; cursor: pointer; }        .form-container button:hover { background-color: #0056b3; }        .error-message { color: red; margin-bottom: 10px; }        .success-message { color: green; margin-bottom: 10px; }        

Sign Up

<?php if (isset($_GET["error"])) { if ($_GET["error"] == "emptyinput") { echo "

Please fill in all fields!

"; } else if ($_GET["error"] == "invalidusername") { echo "

Choose a proper username!

"; } // ... 其他错误处理 else if ($_GET["error"] == "stmtfailed") { echo "

Something went wrong, try again!

"; } } else if (isset($_GET["success"])) { if ($_GET["success"] == "registered") { echo "

You have signed up successfully! You can now log in.

"; } } ?>

Already have an account? Log In

login.php (示例):

    Log In                body { font: 1em sans-serif; }        .form-container { max-width: 400px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; border-radius: 5px; }        .form-container input[type="text"], .form-container input[type="password"] {            width: calc(100% - 22px); padding: 10px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 3px;        }        .form-container button { width: 100%; padding: 10px; background-color: #007bff; color: white; border: none; border-radius: 3px; cursor: pointer; }        .form-container button:hover { background-color: #0056b3; }        .error-message { color: red; margin-bottom: 10px; }        

Sign In

<?php if (isset($_GET["error"])) { if ($_GET["error"] == "emptyinput") { echo "

Please fill in all fields!

"; } else if ($_GET["error"] == "wronglogin") { echo "

Incorrect login information!

"; } else if ($_GET["error"] == "stmtfailed") { echo "

Something went wrong, try again!

"; } } ?>

Don't have an account? Sign Up

2.6 登出 (logout.php)

logout.php 保持不变,它正确地销毁了会话并重定向。


3. 注意事项与最佳实践

变量命名约定: 始终使用清晰且不冲突的变量名。对于数据库连接凭据,可以使用 dbUsername、dbPassword 等,与用户提交的 usernameInput、passwordInput 区分开来。安全哈希密码: 始终使用 password_hash() 和 password_verify() 函数来处理用户密码。切勿直接存储明文密码或使用简单的哈希算法(如MD5, SHA1)。PASSWORD_DEFAULT 选项会自动选择当前PHP版本推荐的哈希算法,并自动处理盐值。预处理语句: 使用 mysqli_prepare() 和 mysqli_stmt_bind_param() 可以有效防止SQL注入攻击,这是任何与数据库交互的应用程序的必备安全措施。错误处理与用户反馈: 提供有意义的错误信息给用户,但不要泄露敏感的系统信息。使用URL参数(如 ?error=…)来传递错误类型,并在前端页面进行相应显示。

以上就是PHP用户认证系统常见问题与安全实践指南的详细内容,更多请关注php中文网其它相关文章!

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

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
利用WebSockets在PHP中实现浏览器与后端进程的实时交互
上一篇 2025年12月12日 21:18:51
Laravel 删除操作后优雅返回上一页与用户反馈机制
下一篇 2025年12月12日 21:19:02

相关推荐

  • mysql创建数据库提示已存在怎么回事

    mysql创建数据库提示已存在怎么回事mysql创建数据库提示已存在怎么回事mysql创建数据库提示已存在怎么回事mysql创建数据库提示已存在怎么回事

    MySQL 创建数据库提示已存在的原因包括:数据库名称冲突、大小写敏感性、特殊字符限制、连接错误、权限问题、命名冲突和表名冲突。请检查并解决这些潜在原因。 MySQL 创建数据库提示已存在的原因 创建 MySQL 数据库时出现 “已存在” 提示,通常有以下几个原因: 1. 数…

    2026年9月25日 • 用户投稿
    000
  • 谷歌浏览器开发者工具网络面板数据延迟如何修复

    谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复谷歌浏览器开发者工具网络面板数据延迟如何修复

    延迟通常由网络环境、浏览器状态或页面性能导致。先通过Waterfall分析DNS、TCP等阶段耗时,确认是否真实延迟;更换网络或设备对比速度;清除缓存、禁用缓存或使用无痕模式排除干扰;检查代理设置并切换为公共DNS;最后结合Performance面板排查脚本阻塞与资源瓶颈。 Chrome开发者工具网…

    2026年9月25日 • 用户投稿
    800
  • PHP一键环境如何配置Memcached_Memcached缓存集成

    首先安装Memcached服务并启动,然后启用PHP的memcached扩展并重启服务,最后通过PHP代码连接并测试缓存读写;具体步骤包括:Windows或Linux系统下安装Memcached服务,确保端口11211监听;在宝塔等环境中安装php-memcached扩展并确认phpinfo显示模块…

    2026年9月25日
    000
  • mysql增删改查语句在哪写

    mysql增删改查语句在哪写mysql增删改查语句在哪写mysql增删改查语句在哪写mysql增删改查语句在哪写

    MySQL 增刪改查語句通常寫在以下位置:SQL 客户端(例如 MySQL Workbench)程式碼中外部檔案儲存程序 MySQL 增刪改查語句在哪裡寫? MySQL 增刪改查語句通常寫在以下位置: 1. SQL 客户端 例如,MySQL Workbench、phpMyAdmin 或命令行界面 (…

    2026年9月25日 • 用户投稿
    000
  • 教你电脑安全证书过期的解决方法

    教你电脑安全证书过期的解决方法教你电脑安全证书过期的解决方法教你电脑安全证书过期的解决方法教你电脑安全证书过期的解决方法

    我们在使用计算机时,常常会遇到安全证书过期的提示,相信不少用户都曾碰到过这类问题。如果你已经确认本地的日期和时间设置无误,那么可以通过重新安装该网站的证书来解决此问题。接下来,就由黑鲨小编为大家详细介绍具体的解决步骤,一起来了解下吧! 1、按下 Win + R 键打开“运行”窗口,输入:mmc,然后…

    2026年9月25日 • 用户投稿
    500
  • vivo浏览器如何彻底删除浏览数据_vivo浏览器完全清除个人浏览数据指南

    vivo浏览器如何彻底删除浏览数据_vivo浏览器完全清除个人浏览数据指南vivo浏览器如何彻底删除浏览数据_vivo浏览器完全清除个人浏览数据指南vivo浏览器如何彻底删除浏览数据_vivo浏览器完全清除个人浏览数据指南vivo浏览器如何彻底删除浏览数据_vivo浏览器完全清除个人浏览数据指南

    首先清除浏览器缓存与历史记录,进入“我的”-“设置”-“清除浏览数据”,勾选浏览历史、缓存文件等项并确认清除;其次通过i管家的“空间清理”功能扫描并清理浏览器残留数据;再者可重置浏览器设置至默认状态,移除个性化配置;最后可卸载并重装vivo浏览器以彻底删除所有数据。 如果您在使用vivo浏览器时希望…

    2026年9月25日 • 用户投稿
    1000
  • 统一解析ISO Zoned Date-Time格式的日期字符串

    统一解析ISO Zoned Date-Time格式的日期字符串统一解析ISO Zoned Date-Time格式的日期字符串统一解析ISO Zoned Date-Time格式的日期字符串统一解析ISO Zoned Date-Time格式的日期字符串

    本教程详细阐述如何在Java 8+中使用java.time API统一解析看似不同但实则遵循ISO 8601扩展ISO_ZONED_DATE_TIME格式的日期字符串。通过ZonedDateTime的直接解析能力和OffsetDateTime结合DateTimeFormatter.ISO_ZONED…

    2026年9月25日 • 用户投稿
    000
  • 漫番漫画官网直达_ 漫番漫画在线网页入口

    漫番漫画官网直达_ 漫番漫画在线网页入口漫番漫画官网直达_ 漫番漫画在线网页入口漫番漫画官网直达_ 漫番漫画在线网页入口漫番漫画官网直达_ 漫番漫画在线网页入口

    漫番漫画官网入口为https://manwa.me,平台汇聚冒险、校园、恋爱、奇幻等多类型海量作品,更新速度快,支持高清流畅阅读与离线缓存,界面简洁,具备智能搜索、书架管理及章节提醒功能,优化横向纵向阅读模式、夜间模式与手势翻页,提升用户沉浸体验。 漫番漫画官网直达入口地址在哪里?这是不少网友都关注…

    2026年9月25日 • 用户投稿
    600
  • mysql下载好了从哪运行

    mysql下载好了从哪运行mysql下载好了从哪运行mysql下载好了从哪运行mysql下载好了从哪运行

    要运行 MySQL,请按照以下步骤操作:解压安装包运行安装向导选择自定义安装类型配置 MySQL 安装安装 MySQL启动 MySQL 服务使用客户端连接到 MySQL 如何运行 MySQL 下载 步骤 1:解压 MySQL 安装包 找到下载的 MySQL 安装包,通常是一个名为“mysql-ins…

    2026年9月25日 • 用户投稿
    100
  • sublime怎么安装和使用DocBlockr插件_sublime使用DocBlockr生成注释的教程

    sublime怎么安装和使用DocBlockr插件_sublime使用DocBlockr生成注释的教程sublime怎么安装和使用DocBlockr插件_sublime使用DocBlockr生成注释的教程sublime怎么安装和使用DocBlockr插件_sublime使用DocBlockr生成注释的教程sublime怎么安装和使用DocBlockr插件_sublime使用DocBlockr生成注释的教程

    安装DocBlockr插件:通过Package Control搜索并安装DocBlockr;2. 使用方法:在函数上方输入/**后回车,自动生成含参数、返回值的注释块;3. 配置优化:可设置快捷键、自定义模板及扩展语言支持,提升注释效率。 在Sublime Text中安装和使用DocBlockr插件…

    2026年9月25日 • 用户投稿
    1100
  • 360极速浏览器收藏夹在哪个文件夹_书签数据文件本地存储路径

    360极速浏览器收藏夹在哪个文件夹_书签数据文件本地存储路径360极速浏览器收藏夹在哪个文件夹_书签数据文件本地存储路径360极速浏览器收藏夹在哪个文件夹_书签数据文件本地存储路径360极速浏览器收藏夹在哪个文件夹_书签数据文件本地存储路径

    首先定位360极速浏览器的书签文件,该文件通常存储在%LOCALAPPDATA%360ChromeChromeUser DataDefault目录下,查找名为Bookmarks和Bookmarks.bak的文件即可获取当前及备份的收藏夹数据。 如果您需要找回或备份360极速浏览器的收藏夹数据,可能需…

    2026年9月25日 • 用户投稿
    100
  • 怎样通过Nginx日志定位网站问题

    怎样通过Nginx日志定位网站问题怎样通过Nginx日志定位网站问题怎样通过Nginx日志定位网站问题怎样通过Nginx日志定位网站问题

    Nginx日志是网站故障排查的利器,它主要包含访问日志和错误日志两部分。本文将指导您如何利用这两类日志高效定位问题。 一、访问日志 (access log) 访问日志记录了所有对网站的请求信息,包括客户端IP、请求时间、URL、HTTP状态码等关键数据。 常用字段说明: $remote_addr:客…

    2026年9月25日 • 用户投稿
    100
  • 使用Apache POI处理日期显示为””的解决方案

    使用Apache POI处理日期显示为””的解决方案使用Apache POI处理日期显示为””的解决方案使用Apache POI处理日期显示为””的解决方案使用Apache POI处理日期显示为””的解决方案

    在使用Apache POI导出Excel时,日期(特别是早期年份)显示为”####”通常是由于单元格宽度不足以完整显示日期值所致。本文将深入探讨这一常见问题,并提供通过调整单元格宽度来有效解决此问题的具体方法和示例代码,确保日期数据能够正确无误地呈现。 问题描述:Apache…

    2026年9月25日 • 用户投稿
    000
  • mysql身份验证方式在哪里

    mysql身份验证方式在哪里mysql身份验证方式在哪里mysql身份验证方式在哪里mysql身份验证方式在哪里

    MySQL 身份验证方式主要有:基于密码的身份验证:用户提供用户名和密码,密码以哈希形式存储。基于证书的身份验证:使用 SSL 证书验证用户身份,每个用户拥有唯一的公钥和私钥。基于 Kerberos 身份验证:使用 Kerberos 协议,用户只需向 Kerberos 服务器进行一次身份验证即可访问…

    2026年9月25日 • 用户投稿
    100
  • 夸克怎么识别图片里的文字_夸克图片文字提取(OCR)功能操作方法

    夸克怎么识别图片里的文字_夸克图片文字提取(OCR)功能操作方法夸克怎么识别图片里的文字_夸克图片文字提取(OCR)功能操作方法夸克怎么识别图片里的文字_夸克图片文字提取(OCR)功能操作方法夸克怎么识别图片里的文字_夸克图片文字提取(OCR)功能操作方法

    1、使用夸克App扫描功能可快速提取图片文字,支持相册导入或拍摄识别,自动完成OCR并复制文本;2、在网页或聊天中长按图片选择“提取图中文字”即可识别并复制或翻译;3、通过文件管理器用夸克打开本地图片,点击T图标识别文字,支持编辑与导出。 如果您在浏览图片时需要快速获取其中的文字内容,但手动输入效率…

    2026年9月25日 • 用户投稿
    000
  • 深入解析:Java中不同ISO时区日期字符串的统一解析策略

    深入解析:Java中不同ISO时区日期字符串的统一解析策略深入解析:Java中不同ISO时区日期字符串的统一解析策略深入解析:Java中不同ISO时区日期字符串的统一解析策略深入解析:Java中不同ISO时区日期字符串的统一解析策略

    本文探讨了如何在Java中统一解析来自API响应的多种ISO时区日期字符串,即使它们在表示上略有差异。核心方法是利用Java 8及更高版本提供的java.time包中的ZonedDateTime或OffsetDateTime类,并结合DateTimeFormatter.ISO_ZONED_DATE_…

    2026年9月25日 • 用户投稿
    000
  • mysql认证有哪些

    mysql认证有哪些mysql认证有哪些mysql认证有哪些mysql认证有哪些

    MySQL提供了多种认证机制,包括:密码认证:要求用户名和密码。插件认证:使用外部模块或程序。临时认证插件:生成一次性令牌或密码。HTTP/HTTPS 认证:使用HTTP或HTTPS协议。LDAP 认证:使用LDAP服务器。MySQL 认证协议:自定义认证协议。选择合适的认证机制取决于安全性要求、部…

    2026年9月25日 • 用户投稿
    400
  • 如何解决Shein广告点击率低的问题?如何加入Shein?Shein广告点击率翻3倍秘诀!2025最新入驻指南,新手必看避坑攻略!

    如何解决Shein广告点击率低的问题?如何加入Shein?Shein广告点击率翻3倍秘诀!2025最新入驻指南,新手必看避坑攻略!如何解决Shein广告点击率低的问题?如何加入Shein?Shein广告点击率翻3倍秘诀!2025最新入驻指南,新手必看避坑攻略!如何解决Shein广告点击率低的问题?如何加入Shein?Shein广告点击率翻3倍秘诀!2025最新入驻指南,新手必看避坑攻略!如何解决Shein广告点击率低的问题?如何加入Shein?Shein广告点击率翻3倍秘诀!2025最新入驻指南,新手必看避坑攻略!

    在shein平台,广告点击率低迷可能导致你预算耗尽却毫无转化!本文将揭晓 5大高效广告优化策略:从场景化视觉呈现(ctr飙升300%)到精准锁定目标人群(聚焦18-34岁女性),再到高转化文案结构(痛点+解决方案+限时福利)。同时,深入解析 2025年入驻shein的3种路径:供应商通道(48小时内…

    2026年9月25日 • 用户投稿
    000
  • 一加R系列微信收款语音播报怎么设置?快速启用支付提示功能

    一加R系列可通过系统辅助功能或第三方APP设置微信收款语音播报。首先检查手机系统更新并开启辅助功能中的语音提示,或下载高评分第三方APP授权通知权限实现播报。尽管微信自带功能较难支持,但可尝试开启到账声音提醒。为确保安全,选用正规渠道APP并注意权限管理。此外,佩戴智能手表、使用收款音箱等也能帮助及…

    2026年9月25日
    100
  • OOP类图在Java面向对象建模中的作用

    类图是Java面向对象建模的核心工具,通过图形化展示类、属性、方法及关系,明确职责边界,支持封装、继承、实现、聚合等机制,揭示对象协作,助力高内聚设计,促进团队沟通,统一UML标准,辅助代码生成与重构,并为应用工厂模式等设计模式提供可视化基础,是连接需求与实现的关键桥梁。 在Java面向对象建模中,…

    2026年9月25日
    100

发表回复

登录后才能评论
关注微信