(一)CSRF简介
- 跨站请求伪造 (Cross-Site Request Forgery, CSRF),攻击者盗用了你的身份,CSRF通过伪装来自受信任用户的请求来利用受信任的网站,以你的名义发送恶意请求。
条件: 用户访问站点A并产生了cookie(有效);用户没有退出A同时访问了B
- 用户输入账号信息请求登录A网站。
- A网站验证用户信息,通过验证后返回给用户一个cookie
- 在未退出网站A之前,在同一浏览器中请求了黑客构造的恶意网站B
- B网站收到用户请求后返回攻击性代码,构造访问A网站的语句
- 浏览器收到攻击性代码后,在用户不知情的情况下携带cookie信息请求了A网站
(二)CSRF防御
(1)验证 HTTP Referer 字段
- HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站。但有方法可以篡改 Referer值,
(2)使用 token
- 在用户登陆后产生token存放于session 之中,然后在每次请求时在页面表单附带上token参数,用户提交请求后,服务器端验证表单中的token是否与用户Session中的token一致,一致为合法请求,不是则非法请求。
这个token的值必须是随机的。由于token的存在,攻击者无法再构造一个带有合法token的请求实施CSRF攻击。另外使用token时应注意token的保密性,尽量把敏感操作由GET改为POST,以form或AJAX形式提交,避免token泄露。
(3).加验证码验证
- 涉及到页面交互,在通常情况下,验证码能很好遏制CSRF攻击。出于用户体验考虑,网站不能给所有的操作都加上验证码。因此验证码只能作为一种辅助手段。