在 PHP 应用中实施 CSRF(跨站请求伪造)防护的方法有很多,以下是一些建议:
// 生成 CSRF 令牌
session_start();
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 在表单中添加隐藏字段
<form action="submit.php" method="post">
<!-- 其他表单字段 -->
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<input type="submit" value="提交">
</form>
// 验证 CSRF 令牌
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
// 处理表单数据
} else {
// 阻止请求,可能是 CSRF 攻击
}
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 攻击。但请注意,安全性是一个持续的过程,需要定期审查和更新你的代码和配置。