跨站请求伪造(CSRF)是一种网络攻击,攻击者通过伪造已经登录的用户发起恶意请求
使用CSRF令牌:在用户提交表单时,添加一个隐藏字段,包含一个随机生成的、不可预测的令牌。将该令牌存储在用户的会话中,并在表单提交时进行验证。这样,只有知道正确令牌的请求才能通过验证。// 生成 CSRF 令牌session_start();$csrf_token = bin2hex(random_bytes(32));$_SESSION['csrf_token'] = $csrf_token;// 在表单中添加隐藏字段echo '<form action="submit.php" method="post">';echo '<input type="hidden" name="csrf_token" value="' . $csrf_token . '">';// 其他表单字段...echo '</form>';// 验证 CSRF 令牌if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) { // 处理表单数据} else { // 无效的 CSRF 令牌,拒绝请求}使用框架内置的CSRF保护:许多PHP框架都提供了内置的CSRF保护机制。例如,Laravel框架提供了一个名为@csrf的Blade指令,可以轻松地在表单中添加CSRF令牌。<!-- Laravel Blade 模板 --><form action="/submit" method="post"> @csrf <!-- 其他表单字段... --></form>双重cookie提交:在此方法中,要求客户端发送两个相同的cookie,一个作为 HTTP Cookie 头,另一个作为请求参数(例如表单字段或请求头)。只有当这两个值相同时,请求才会被接受。// 设置 cookiesession_start();setcookie('csrf_token', $_SESSION['csrf_token'], 0, '/');// 验证 cookieif (isset($_COOKIE['csrf_token']) && isset($_POST['csrf_token']) && $_COOKIE['csrf_token'] === $_POST['csrf_token']) { // 处理表单数据} else { // 无效的 CSRF 令牌,拒绝请求}使用 SameSite 属性:通过设置 cookie 的 SameSite 属性,可以防止浏览器在跨站点请求时发送 cookie。这样,攻击者无法利用用户的登录状态发起恶意请求。// 设置 SameSite 属性session_start();setcookie('csrf_token', $_SESSION['csrf_token'], ['samesite' => 'Strict']);使用 Content Security Policy:Content Security Policy (CSP) 是一种安全策略,可以限制页面上的内容来源。通过设置合适的 CSP 策略,可以防止攻击者利用跨站点脚本(XSS)漏洞发起 CSRF 攻击。Content-Security-Policy: default-src 'self'; script-src 'self' https://trustedscripts.example.com;结合以上方法,可以有效地防范 CSRF 攻击。在选择方法时,请根据您的应用程序和框架需求进行权衡。


