网络安全-CSRF

原文

github.com/CodeLittleP…html

CSRF介绍

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

简单的说,就是利用游览器对用户的信任,好比,用户已经登陆了ww.aaa.com,天然aaa这个网站就会将用户的登陆状态session存在cookie中; 而后,aaa.com这个网页有一个对做品点赞的功能,点赞提交地址为aaa.com/api.like?id=777; 这时,另一个叫www.bbb.com的网站,放了这样一个元素<img src="aaa.com/api.like?id=888">,这样的话,一旦用户进入这个bbb.com页面,就会请求aaa.com这个网站的点赞接口,并且点赞的用户对象是888; 最后由于用户的登陆信息还没有过时,那就等于给id为888这个做品点赞了,然而,用户并不知情。git

防护方式

有两种方法:github

  1. 后端判断referer是否合法(不推荐) 经过HTTP的referer可知道,用户是经过哪一个网站发送这个请求的。可是referer的判断并非好方法,有各类方式能够绕过的方法,具体可见 CSRF 花式绕过Referer技巧>>
  2. 每次请求带上token 好比laravel,在后端模板渲染的时候会提供一个csrf的token,这样的话,不一样域的网站是拿不到token的,因此也就防止了csrf了。

补充

使用iframe会引出一些不安全的问题,好比绕过referer验证,好比资源盗用等,因此,不少网站会设置X-Frame-OptionsDENY,这也是一个安全的补充点。web

Q&A

问:既然请求静态资源都是get请求,那么要是后端把点赞接口改成post的方式也能够吧?后端

答:不能够。由于,bbb.com网站彻底能够设置一个form表单,action为bbb.com,method为post,接着input的name为id,value为888,而后,script代码直接submit表单。为了页面不重定向,还能够在form外层加一个iframe。因为form表单实际上是直接跳转,因此不存在跨域的问题。api

总结

防止CSRF的最好方法仍是带token吧~跨域

相关文章
相关标签/搜索