php csrf实现
PHP 实现 CSRF 防护
CSRF(跨站请求伪造)是一种常见的网络攻击方式,攻击者通过伪造用户的请求,利用用户在目标网站的登录状态执行恶意操作。在 PHP 中,可以通过以下方法实现 CSRF 防护:
生成 CSRF Token
在用户会话开始时生成一个唯一的 Token,并将其存储在会话变量中。Token 应具有足够的随机性,防止被猜测。
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
在表单中嵌入 Token
将生成的 Token 嵌入到 HTML 表单中,通常以隐藏字段的形式存在。
<form action="process.php" method="post">
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
<!-- 其他表单字段 -->
<input type="submit" value="提交">
</form>
验证 Token
在处理表单提交时,验证提交的 Token 是否与会话中存储的 Token 一致。如果不一致,拒绝请求。

session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF 验证失败');
}
// 处理表单数据
}
使用中间件简化流程
在框架(如 Laravel)中,可以创建中间件自动处理 CSRF 防护。以下是一个简单的中间件示例:
class VerifyCsrfToken {
public function handle($request, $next) {
if ($request->method() === 'POST') {
$token = $request->input('csrf_token');
if ($token !== $_SESSION['csrf_token']) {
abort(403, 'CSRF 验证失败');
}
}
return $next($request);
}
}
设置 Token 过期时间
为 Token 设置过期时间,增加安全性。可以在生成 Token 时记录时间戳,验证时检查是否过期。

$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
$_SESSION['csrf_token_time'] = time();
if (time() - $_SESSION['csrf_token_time'] > 3600) {
die('CSRF Token 已过期');
}
使用 SameSite Cookie 属性
通过设置 Cookie 的 SameSite 属性为 Strict 或 Lax,可以进一步防止 CSRF 攻击。
session_set_cookie_params([
'samesite' => 'Strict',
'secure' => true,
'httponly' => true
]);
session_start();
避免 GET 请求修改数据
确保所有修改数据的操作(如删除、更新)使用 POST 或其他非 GET 方法,避免通过 URL 触发 CSRF 攻击。
使用框架内置功能
现代 PHP 框架(如 Laravel、Symfony)通常内置了 CSRF 防护功能。以 Laravel 为例,可以通过 @csrf Blade 指令自动生成和验证 Token。
<form method="POST" action="/profile">
@csrf
<!-- 表单内容 -->
</form>
通过以上方法,可以有效防止 CSRF 攻击,确保应用程序的安全性。






