在 PHP 应用中实施 CSRF(跨站请求伪造)防护的方法有很多,以下是一些建议:
- 使用 CSRF 令牌:为每个用户会话生成一个唯一的 CSRF 令牌,并将其存储在 session 中。在表单中包含一个隐藏字段,其中包含 CSRF 令牌。当收到表单提交时,验证表单中的令牌与 session 中的令牌是否匹配。
// 生成 CSRF 令牌 session_start(); if (!isset($_SESSION['csrf_token'])) { $_SESSION['csrf_token'] = bin2hex(random_bytes(32)); } // 在表单中添加隐藏字段// 验证 CSRF 令牌 if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) { // 处理表单数据 } else { // 阻止请求,可能是 CSRF 攻击 }
- 同源策略:确保你的 PHP 应用只接受来自同一来源的请求。这可以通过设置 HTTP 响应头来实现,例如
Content-Security-Policy
和X-Frame-Options
。
header('Content-Security-Policy: default-src \'self\';'); header('X-Frame-Options: SAMEORIGIN');
-
使用 HTTP POST 属性:对于敏感操作,使用 HTTP POST 方法而不是 GET 方法,因为 POST 请求不会被浏览器预先缓存或预先执行。
-
验证 Referer 头:检查 HTTP 请求的 Referer 头,确保请求来自受信任的源。但请注意,Referer 头可以被伪造,因此不能完全依赖它。
$allowed_referer = 'https://yourdomain.com'; if (strpos($_SERVER['HTTP_REFERER'], $allowed_referer) !== 0) { // 阻止请求,可能是 CSRF 攻击 }
-
使用最新的 PHP 和框架:确保你使用的 PHP 版本和框架都是最新的,以便获得最新的安全功能和修复程序。
-
使用内容安全策略(CSP):CSP 是一种安全机制,可以限制页面上的内容的来源。这可以防止恶意脚本执行 CSRF 攻击。
header('Content-Security-Policy: default-src \'self\'; script-src \'self\' https://trustedscripts.example.com;');
结合以上方法,可以有效地防止 CSRF 攻击。但请注意,安全性是一个持续的过程,需要定期审查和更新你的代码和配置。