2023-11-23 00:25:22
Phpcms中防御CSRF攻击需通过Token验证、Referer检查、POST提交限制及SameSite Cookie属性组合实现,核心是生成并比对随机Token,同时结合多重安全措施提升防护能力。 以下是具体防护方法及实现细节:
1. Token令牌验证机制生成Token:在表单生成页面,后端生成随机Token并保存至Session。session_start();$_SESSION['csrf_token'] = bin2hex(random_bytes(16)); // 生成16字节随机Token
嵌入表单:将Token作为隐藏字段插入HTML表单。<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
验证Token:提交表单时,服务器端校验Token是否匹配。if ($_POST) { if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) { die('非法请求:Token验证失败'); } // 处理正常逻辑 $_SESSION['csrf_token'] = bin2hex(random_bytes(16)); // 更新Token}
Referer可能被客户端屏蔽或篡改,不可单独依赖,需与Token验证结合使用。
适用于关键操作接口的初步过滤。
将敏感链接改为表单提交:例如删除操作需通过表单提交ID和Token。<!-- 错误示例:GET请求直接触发删除 --><a href="/delete?id=1">删除</a><!-- 正确示例:POST表单提交 --><form method="POST" action="/delete"> <input type="hidden" name="id" value="1"> <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"> <button type="submit">删除</button></form>
后端校验:确保POST请求包含有效Token。if ($_SERVER['REQUEST_METHOD'] === 'POST') { // 校验Token逻辑...}
Strict:Cookie仅在同站请求中发送,完全阻止跨站CSRF攻击。
Lax:允许部分安全GET请求(如导航链接)携带Cookie,适用于需要兼容性的场景。
Phpcms防御CSRF需以Token验证为核心,配合Referer校验、POST方法限制及SameSite Cookie属性,形成“验证-过滤-限制”的防护链。开发者应避免依赖单一措施,尤其老系统需主动加固,确保关键操作的安全性。