每次敏感操作前用 bin2hex(random_bytes(32)) 生成唯一令牌并存入 $_session['csrf_token'],表单中以 htmlspecialchars() 转义后嵌入隐藏字段;提交时用 hash_equals() 恒定时间校验,通过后刷新令牌,失败则中止执行,并配合 post 限定、samesite=lax 等防护。

生成唯一且不可预测的令牌
每次用户访问含敏感操作的页面(如修改密码、删除数据)前,必须调用安全随机函数生成新令牌。推荐使用 bin2hex(random_bytes(32)),它比 time().rand() 或 md5(uniqid()) 更抗预测。生成后立即存入 $_SESSION['csrf_token'],确保与当前会话强绑定。
将令牌嵌入表单并安全输出
在渲染HTML表单时,把已生成的令牌作为隐藏字段写入:
- 先在PHP逻辑层完成生成和存储,不要在HTML标签内联执行 session_start() 或随机函数
- 用 htmlspecialchars() 转义后再输出到 value 属性,防止XSS干扰
- 示例:
<input type="hidden" name="token" value="<?php echo htmlspecialchars($_SESSION['csrf_token']); ?>">
提交时严格比对并及时清理
收到POST请求后,校验流程不能跳步:
- 确认 $_POST['token'] 存在且非空
- 使用 hash_equals() 进行恒定时间比对,避免时序攻击
- 校验通过后建议刷新令牌(重新生成并覆盖 $_SESSION['csrf_token']),防止重放
- 失败时直接中止脚本,不继续处理业务逻辑
配合基础防护增强健壮性
单一Token机制不是万能的,需叠加常规措施:
- 敏感操作只接受 POST 方法,禁用 GET 执行状态变更
- 设置 Cookie 的 SameSite=Lax(PHP 7.3+ 可用
session_set_cookie_params(['samesite' => 'Lax'])) - 避免在 URL、日志或 Referer 中暴露 Token
- 可选:将 Token 与用户ID或IP片段哈希绑定,进一步限制作用域
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











