跨站请求伪造CSRF的攻击与防御

158 阅读2分钟

跨站请求伪造CSRF的本质是因为浏览器过分的信任了web服务器。

跨站脚本攻击XSS的本质是因为web服务器过分的信任了浏览器(用户输入)。

1、跨站请求伪造CSRF的原理图

CSRF的本质是浏览器(用户)过分相信了web服务器(的返回值)。 CSRF.png 要造成CSRF必须同时满足两个条件: (1)用户成功登录正常网站A,并且在本地生成cookie进行保存。 (2)用户在未退出正常网站A的时候,或者本地cookie未失效的时候,访问了恶意网站B。 当这两个条件满足的时候,恶意网站B就可以伪造一个用户的请求,携带着用户的cookie去访问正常网站A。这个时候正常网站A以为该请求来自于真实用户,从而执行该操作。

2、CSRF防御

CSRF的本质是利用了cookie伪造了用户的请求,所以解决的思路有以下几种:

  1. 将cookie的samesite属性设置为严格。即不是同一个站点发起的请求则不允许携带之前生成的cookie值。
  2. 同源检查。通过检查http包头的origin和referer,确定当前请求的orgin是否是同一个,如果不是同一个则拒绝请求。
  3. 使用验证码机制。CSRF的原理就是在用户不知情的情况下访问了正常网站A,那么可以将所有的访问请求都经过一个验证码机制,这样用户就能意识到这次的访问行为了。
  4. 使用Token机制。每次的http请求都需要携带一个token值(随机值),而token值是由web服务器保存在服务器端的,每次请求都需要检查这个token是否一样,不一样则拒绝请求。
  5. 限制GET操作,尽量使用POST方法。因为GET方法实在太容易被拿去做CSRF攻击了。