跨站请求伪造(Cross-Site Request Forgery, CSRF)的检测和防御通常涉及以下几个步骤:
- 使用防CSRF令牌:在表单提交或其他敏感操作中加入一个随机生成的token,这个token同时存储在服务器端的会话中和前端的cookie里。每次请求时都需要携带此token,服务器验证两者是否匹配以确认请求的真实性。
- 校验Referer头信息:虽然不能完全依赖,但可以检查HTTP Referer头来判断请求是否来自预期的源。攻击者通常无法伪造Referer信息。
- 二次确认:对于关键操作,可以采取二次确认机制,比如点击邮件中的链接完成登录或交易,进一步保证用户意愿。
- 启用HttpOnly和Secure标志:设置cookie的这两个属性可以阻止JavaScript获取和篡改token,增加安全性。
在服务器端,可以通过在设置cookie时添加HttpOnly和Secure标志来启用这两个属性:
res.cookie('token', token, { httpOnly: true, secure: true });
在上述代码中,res是服务器的响应对象,token是要设置的cookie的值。
httpOnly: true表示该cookie只能通过HTTP协议传输,不能通过JavaScript访问,从而防止了跨站点脚本攻击(XSS)。
secure: true表示该cookie只能通过HTTPS协议传输,不能通过HTTP协议传输,从而增加了对网络窃听的防护。
- 使用验证码:对于高风险场景,可以考虑使用验证码来防止自动化攻击。
- API层面的验证:如果涉及到API调用,可以在API端也添加CSRF验证,如在JWT(JSON Web Tokens)中包含一个nonce(一次性请求标记)。
API层面的验证可以通过以下方式进行:
- CSRF验证(Cross-Site Request Forgery):在API端添加CSRF验证可以防止恶意站点通过伪造请求发送给API。可以在请求头或请求体中包含一个CSRF令牌,API接收到请求后会验证该令牌的有效性。
- JWT验证(JSON Web Tokens):JWT是一种用于身份验证和信息传递的开放标准。在API调用中,可以将JWT作为认证令牌发送给API端,并在API端对JWT进行验证,以确保请求的合法性和完整性。可以在JWT中添加一个nonce(一次性请求标记),用于防止重放攻击。
- OAuth验证:如果API需要进行用户身份验证,可以使用OAuth来进行授权。OAuth提供了一种安全的授权机制,允许第三方应用程序通过授权令牌访问用户的资源,同时保护用户的隐私和安全。
- API密钥验证:可以为每个API调用生成一个唯一的API密钥,并在请求中包含该密钥。API端接收到请求后,会验证该密钥的有效性,以确保请求来自授权的应用程序。
- 定期审计和更新:保持警惕,定期审查代码库,查找是否有新的CSRF漏洞,并及时修复。
- 教育用户:让用户了解CSRF的风险,提醒他们不要随便点击不明来源的链接或填写表单。