原理
- 跨站点请求伪造,攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作,比如以你的名义发送邮件、发消息,盗取你的账号,添加系统管理员,甚至于购买商品、虚拟货币转账等
防御
- 1、验证HTTP Referer 字段 但是Referer 的值是由浏览器提供的,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。如有些浏览器可以修改referer值,甚至有些组织担心,就会拒绝合法用户访问
- 2、在请求地址中添加
- 现在业界对CSRF的防御,一致的做法是使用一个Token(Anti CSRF Token)。
例子:
- 1. 用户访问某个表单页面。
- 2. 服务端生成一个Token,放在用户的Session中,或者浏览器的Cookie中。
- 3. 在页面表单附带上Token参数。
- 4. 用户提交请求后, 服务端验证表单中的Token是否与用户Session(或Cookies)中的Token一致,一致为合法请求,不是则非法请求。
- 这个Token的值必须是随机的,不可预测的。由于Token的存在,攻击者无法再构造一个带有合法Token的请求实施CSRF攻击。另外使用Token时应注意Token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免Token泄露。
- 注意:CSRF的Token仅仅用于对抗CSRF攻击。当网站同时存在XSS漏洞时候,那这个方案也是空谈。所以XSS带来的问题,应该使用XSS的防御方案予以解决。