如何保护PHP应用程序:安全身份验证完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么“自研”身份验证是一颗定时炸弹

\n\n

每两个PHP开发者中,就有一个曾编写过自己的登录系统。这看起来很简单:表单、登录验证、会话。但正是在这个“简单”的阶段,数百万网站遭遇了灭顶之灾。SQL注入、会话窃取、密码暴力破解——这些攻击会让您的项目变成个人数据的泄露源。

\n\n

在本文中,我们将从零开始讲解PHP安全身份验证。没有任何魔法——只有经过验证的实践,这些实践被Facebook、GitHub以及您最喜欢的框架所采用。您将学习如何正确哈希密码、保护会话不被劫持,以及如何引入JWT等现代机制。

\n\n

准备好了吗?我们开始吧。

\n\n

1. 密码哈希:为什么md5()等于死刑判决

\n\n

安全的第一条规则:永远,永远不要以明文形式存储密码。第二条规则:不要使用MD5或SHA1等过时算法。它们可以在微秒内被计算出来,任何带着笔记本电脑的学生都能在一小时内破解您的密码。

\n\n

PHP内置了解决方案——password_hash()和password_verify()函数。它们使用bcrypt(如果PHP ≥ 7.2,则使用Argon2),并自动添加“盐值”——一个使每个哈希值独一无二的随机字符串。

\n\n

正确哈希的示例

\n
// 用户注册\n$password = $_POST['password'];\n$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);\n\n// 将$hash保存到数据库\n// 无需手动添加盐值!PHP会自行处理。\n
\n\n

登录时验证密码

\n
// 用户登录\n$inputPassword = $_POST['password'];\n$storedHash = '来自数据库';\n\nif (password_verify($inputPassword, $storedHash)) {\n    // 密码正确——允许登录\n} else {\n    // 密码错误\n}\n
\n\n

请注意cost参数。它设置了哈希计算的“成本”。数值越高,攻击者破解密码所需的时间就越长。对于2024年来说,cost = 12是安全性与速度之间的黄金平衡点。

\n\n

2. 会话:如何不交出家门钥匙

\n\n

成功登录后,我们通常会启动一个会话。但标准的PHP会话存在弱点:可预测的ID、通过URL泄露、会话固定攻击。

\n\n

安全会话配置

\n
// 在脚本最开头,输出任何HTML之前\nini_set('session.use_only_cookies', 1);\nini_set('session.use_strict_mode', 1);\nini_set('session.cookie_httponly', 1);\nini_set('session.cookie_secure', 1); // 仅限HTTPS\nini_set('session.cookie_samesite', 'Lax');\n\nsession_start();\n\n// 登录后重新生成会话ID\nif ($login_success) {\n    session_regenerate_id(true);\n    $_SESSION['user_id'] = $user['id'];\n}\n
\n\n

我们做了什么:

\n
    \n
  • use_only_cookies — 禁止通过URL传递会话ID(防止从链接中被窃取)
  • \n
  • use_strict_mode — 阻止未初始化的会话
  • \n
  • httponly — 禁止JavaScript访问会话Cookie(防止XSS攻击)
  • \n
  • secure — Cookie仅通过HTTPS传输
  • \n
  • samesite — 通过伪造跨站请求来防御CSRF攻击
  • \n
\n\n

最重要的是:登录后始终重新生成会话ID。否则,攻击者可能提前将自己的会话ID提供给用户,从而劫持账户。

\n\n

3. CSRF防护:验证请求是否由您发送

\n\n

CSRF(跨站请求伪造)是一种攻击,当用户点击类似/delete-account?id=1的链接时,会在不知情的情况下执行某个操作。为了避免这种情况,请使用令牌。

\n\n

CSRF令牌的生成与验证

\n
// 生成令牌(在会话开始时或加载表单时)\nif (empty(                

博客

书籍推荐