php csrf实现
CSRF 防护实现方法
在 PHP 中,防止跨站请求伪造(CSRF)攻击的常见方法是使用令牌(Token)机制。以下是几种实现方式:
使用随机令牌验证
生成一个随机令牌并存储在会话中,表单提交时验证该令牌是否匹配。
// 生成令牌并存储到 session
session_start();
if (empty($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
// 在表单中嵌入令牌
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
// 处理表单时验证令牌
if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF 验证失败');
}
自动为表单添加令牌
通过全局函数或中间件自动为所有表单添加 CSRF 令牌字段。

function csrf_field() {
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';
}
// 在模板中调用
csrf_field();
使用双重 Cookie 验证
设置一个 HTTP-only 的 Cookie 和表单中的令牌进行双重验证。
setcookie('csrf_cookie', bin2hex(random_bytes(32)), 0, '/', '', true, true);
$_SESSION['csrf_token'] = $_COOKIE['csrf_cookie'];
框架集成方法

现代 PHP 框架通常内置 CSRF 防护:
Laravel 示例:
// 表单中自动生成
@csrf
// 验证中间件会自动处理
Symfony 示例:
// 在表单类型中
$builder->add('_token', CsrfTokenType::class);
最佳实践
- 令牌应足够随机且不可预测
- 每个会话使用不同令牌
- 重要操作需要重新验证
- 考虑令牌过期时间
- 对于 API 可使用不同的验证机制
实现时需根据具体应用场景选择合适方案,同时结合其他安全措施如 HTTPS、输入验证等。






