
本文旨在解决在使用 PHP PDO 进行用户登录验证时,由于 SQL 查询语句逻辑错误导致用户名或邮箱验证失败的问题。通过分析问题代码,我们将提供一种更简洁、安全且高效的解决方案,避免不必要的数据库查询,并提升用户体验。此外,本文还将讨论一些安全最佳实践,以防止潜在的攻击。
问题分析
原代码在 loginUser() 函数中存在一个逻辑上的问题。在验证用户密码之后,它尝试执行第二个 SELECT 查询,该查询试图将原始密码与数据库中存储的哈希密码进行比较。由于数据库中存储的是哈希密码,原始密码永远不会匹配,导致验证失败。此外,这个额外的查询是不必要的,因为用户的信息已经在第一个查询中获取。
解决方案
最佳解决方案是移除不必要的第二个 SELECT 查询,并在第一个查询中选择所有需要的字段(例如,用户名、ID 和密码)。这样,我们可以在验证密码后直接将用户信息存储到会话中,而无需再次查询数据库。
修改后的 loginUser() 函数如下所示:
1.1.8PbootCMS
PbootCMS是一款高效、简洁、强悍的开源PHP企业网站开发建设管理系统。PbootCMS 1.1.8 更新日志:2018-08-071.修复提交表单多选字段接收数据问题;2.修复登录过程中二次登陆在页面不刷新时验证失败问题;3.新增搜索结果fuzzy参数来控制是否模糊匹配;4.新增父分类,顶级分类名称及链接独立标签,具体见手册;5.新增内容多图拖动排序功能。
243 查看详情
立即学习“PHP免费学习笔记(深入)”;
protected function loginUser($userID, $password) { $sql = "SELECT username, id, password FROM db_cms_users WHERE username = ? OR email = ?"; $stmt = $this->connect()->prepare($sql); if(!$stmt->execute([$userID, $userID])) { $stmt = null; header("location: index.php?error=failstmt"); exit(); } if($stmt->rowCount() == 0) { $stmt = null; header("location: login.php?error=loginerror"); exit(); } $user = $stmt->fetchAll(); $checkPwd = password_verify($password, $user[0]['password']); if($checkPwd == false) { header("location: index.php?error=wrongpwd"); exit(); } elseif($checkPwd == true) { session_start(); $_SESSION['username'] = $user[0]['username']; $_SESSION['uid'] = $user[0]['id']; return true; }}
代码解释:
修改 SQL 查询语句: $sql = “SELECT username, id, password FROM db_cms_users WHERE username = ? OR email = ?”; 此语句现在选择用户名、ID 和密码,以便在成功验证密码后可以直接使用这些信息。移除第二个查询: 删除了原代码中验证密码后的第二个 SELECT 查询,因为它是不必要的。直接使用查询结果: 成功验证密码后,直接从 $user 数组中获取用户名和 ID,并将它们存储到会话变量中。
注意事项和总结
SQL 注入防护: 始终使用预处理语句(prepared statements)和参数绑定来防止 SQL 注入攻击。在上面的代码中,$stmt = $this-youjiankuohaophpcnconnect()->prepare($sql); 和 $stmt->execute([$userID, $userID]); 实现了这一点。密码哈希: 使用 password_hash() 函数对用户密码进行哈希处理,并使用 password_verify() 函数验证密码。这是保护用户密码的必要步骤。错误提示: 避免向用户透露过于详细的错误信息,例如用户名是否存在。这可以防止恶意用户利用这些信息进行攻击。统一的 “无效凭据” 错误消息可以提高安全性。会话安全: 确保正确配置会话,例如设置 session.cookie_secure 和 session.cookie_httponly 标志,以提高会话安全性。代码简化: 优化代码,避免不必要的数据库查询,提高性能。
通过遵循这些最佳实践,您可以构建一个更安全、高效的 PHP 登录系统。记住,安全性是一个持续的过程,需要不断审查和改进。
以上就是修复 PHP PDO 登录验证中用户名/邮箱验证失败的问题的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/730489.html
微信扫一扫
支付宝扫一扫