CSRF 2022-05-21

跨站请求伪造(Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

一次成功的CSRF攻击需要满足2个条件:1. 冒用了前端用户的登陆态身份 2. 后台服务无条件信任请求

浏览器默认携带本次http请求域名的cookie,这给了攻击者极大的便利去窃取用户的登录态身份。于是,一个典型的CSRF攻击有着如下的流程:

受害者登录a.com,并保留了登录凭证(Cookie)
攻击者引诱受害者访问了b.com
在受害者不之情的情况下,b.com 悄悄地向 a.com 发送了一个请求:a.com/act=xx。由于请求的域是a.com,于是浏览器会默认携带a.com的Cookie(完成身份冒用)
a.com接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求(无条件信任请求)
a.com以受害者的名义执行了act=xx
攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让a.com执行了自己定义的操作

CSRF的特点
攻击一般发起在第三方网站
攻击利用受害者在被攻击网站的登录凭证,冒充受害者提交操作;而不是直接窃取数据
整个过程攻击者并不能获取到受害者的登录凭证,仅仅是“冒用”
跨站请求可以用各种方式:图片URL、超链接、CORS、Form提交等等。部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪

因此,为了防止CSRF攻击,前端和后端都做了相应的措施

  • 前端:浏览器的同源策略
    浏览器有同源策略,限制了前端不能发起和当前所在页面的域名不一致的其他域名请求,也就是说,在b.com的页面下无法发起对a.com资源的请求。比如你先登录了www.qq.com,产生了cookie,然后不小心访问了www.hack.com的页面,里面有个删除qq相册的链接www.qq.com/deletephoto,你刚好点击了,就会把qq.com的cookie带过去,如果请求成功那直接把你的相片全删了,很可怕!但是请求跨域了,浏览器的同源策略不会让hack得逞
    当然这也导致了一些跨域问题,例如通常一些静态资源很多是跨域的,比如加载别的域名下的图片。这需要服务端加跨域头,前端的请求也带上crossorigin属性
  • 后端:为了防止跨域攻击,使用ACAO
    后端可以设置Access-Control-Allow-Origin来设置哪些源站可以跨域访问自己。而为了配合后端对请求来源的判断,http header 增加了OriginReferrer字段,在浏览器环境下它们都是在请求时由浏览器带上并且不可篡改的
    Origin的值是发起请求时所在页面的域名,后端的Access-Control-Allow-Origin设置了域白名单,请求的header的Origin在白名单内,就允许访问资源,否则就是非法的跨域访问
    Referrer的值是发起请求时所在页面的url,后端也可以通过Referrrer做白名单判断就能防止常见的CSRF攻击

你可能感兴趣的:(CSRF 2022-05-21)