推荐答案
为了防止跨站请求伪造 (CSRF),可以采取以下几种措施:
使用 CSRF Token:在表单或请求中包含一个随机生成的 CSRF Token,并在服务器端验证该 Token 的有效性。只有 Token 验证通过,请求才会被处理。
SameSite Cookie 属性:设置 Cookie 的
SameSite
属性为Strict
或Lax
,以防止跨站请求携带 Cookie。验证 HTTP Referer 头部:检查请求的
Referer
头部,确保请求来自合法的源。双重提交 Cookie:将 CSRF Token 同时存储在 Cookie 和请求参数中,并在服务器端验证两者是否匹配。
本题详细解读
1. 使用 CSRF Token
CSRF Token 是一种常见的防御机制。服务器在生成页面时,会为每个用户会话生成一个唯一的 Token,并将其嵌入到表单或请求中。当用户提交表单或发起请求时,服务器会验证该 Token 是否与用户会话中的 Token 匹配。如果不匹配,请求将被拒绝。
<form action="/submit" method="POST"> <input type="hidden" name="csrf_token" value="随机生成的Token"> <!-- 其他表单字段 --> <button type="submit">提交</button> </form>
2. SameSite Cookie 属性
SameSite
是 Cookie 的一个属性,用于控制 Cookie 在跨站请求时是否会被发送。设置为 Strict
时,Cookie 只会在同站请求时发送;设置为 Lax
时,Cookie 会在同站请求和部分跨站请求(如导航)时发送。
Set-Cookie: sessionId=abc123; SameSite=Strict; Secure
3. 验证 HTTP Referer 头部
通过检查请求的 Referer
头部,可以判断请求是否来自合法的源。如果 Referer
头部不存在或指向不信任的域名,服务器可以拒绝该请求。
if (req.headers.referer && !req.headers.referer.startsWith('https://trusted-domain.com')) { return res.status(403).send('Forbidden'); }
4. 双重提交 Cookie
双重提交 Cookie 是一种增强的 CSRF 防御机制。服务器在生成页面时,将 CSRF Token 同时存储在 Cookie 和请求参数中。当用户提交请求时,服务器会验证这两个 Token 是否匹配。
Set-Cookie: csrf_token=随机生成的Token; HttpOnly; Secure
<form action="/submit" method="POST"> <input type="hidden" name="csrf_token" value="随机生成的Token"> <!-- 其他表单字段 --> <button type="submit">提交</button> </form>
通过以上方法,可以有效防止跨站请求伪造攻击。