当前位置: 首页 > Web前端 > HTML

20170813-CSRFCrossSiteRequestForgery

时间:2023-04-02 12:52:49 HTML

CSRFCSRF是CrossSiteRequestForgery的缩写,翻译过来就是CrossSiteRequestForgery。跨站:顾名思义,就是从一个网站到另一个网站。请求:HTTP请求。伪造:这里可以理解为模仿、伪装。合起来的意思就是:A网站向B网站发起了一个请求,这个请求是经过伪装的。伪装操作的目的是让请求看起来像是从B网站发起的,也就是说,让B网站所在的服务器误认为请求是从自己的网站发起的,而不是从B网站发起的。一个网站。CSRF攻击是黑客利用受害者的cookie来欺骗服务器的信任,但是黑客无法得到cookie,也看不到cookie的内容。另外,由于浏览器同源策略的限制,黑客无法解析服务器返回的结果。因此,黑客无法从返回的结果中得到任何信息。他能做的就是向服务器发送请求,执行请求中描述的命令,直接在服务器端改变数据的值,而不是窃取服务器中的数据。因此,我们要保护的对象是可以直接产生数据变化的服务,读取数据的服务不需要CSRF保护。原理图来源:CSRF攻击原理及nodejs的实现与防御 从上图可以看出,假装从网站A发起请求,必须依次完成两个步骤:  1。登录可信网站A,并在本地生成cookies。  2。在不退出A的情况下访问危险网站B。  之所以假装从A网站发起,是因为cookies不能跨域发送。结合上面的例子,就是:如果一个请求是直接从A网站发送到B网站的服务器,是不可能把A网站生成的cookies一起发送到B服务器的。为什么要发送cookie?这是因为服务器在用户登录后会在cookie中返回一些用户信息给客户端,然后客户端在请求一些需要认证的资源时会把cookie发送给服务器。进行用户认证的信息,认证通过后才会做出正确的响应。当B网站访问A网站服务器上一些需要认证的资源时,如果没有cookie信息,服务器拒绝访问,那么B网站就无法进行恶意操作。而如果请求伪造成AB网站,则可以将A网站的cookie一起发送给A服务器。这时候服务器认为这个请求是合法的,就会给出正确的响应。这时候B网站的目的就达到了。.妥协攻击者窃取了您的身份并代表您发送了恶意请求。CSRF可以做的包括:以你的名义发送邮件和信息,窃取你的账户,甚至购买商品,转移虚拟货币……造成的问题包括:个人隐私泄露和财产安全。如何防范CSRF攻击CSRF攻击之所以能够得逞,是因为黑客可以完全伪造用户请求。请求中所有的用户认证信息都存在cookie中,黑客可以在不知道认证信息的情况下直接利用用户。cookie以通过安全验证。防御CSRF的关键是在请求中放入黑客无法伪造的信息。对于关键操作,使用post方法:出于安全考虑,目前的浏览器默认有一定的限制。通过表单标签发送到其他网站的请求将被拦截。使用验证码:强制用户与应用交互,完成最终请求。例如:用户每次提交表单时,都需要填写一个验证码。向请求地址添加令牌并验证AntiCSRFToken。当服务器收到路由请求时,它会生成一个随机数,并在渲染请求页面时嵌入随机数。页面(一般嵌入在form表单中,)在服务器端设置setCookie,随机数作为cookie植入用户浏览器或session当用户发送GET或者POST请求时带上_csrf_token参数(对于Form表单,可以直接提交,因为当前表单的所有输入都会自动提交到后台,包括_csrf_token)。后台收到请求后,解析请求的cookie得到_csrf_token值,然后与用户请求提交的_csrf_token进行比较。如果它们相等,则请求是合法的。注意:Token最好保存在Session中。如果Token保存在cookie中,用户的浏览器会打开很多页面(同一个页面被打开多次)。一些页面Token被使用和消费后,会再次种植新的Token,但是旧的Token还在那些旧的Tab页面对应的HTML中。这会让用户想到为什么几分钟前打开的页面不能正常提交,尽量少用GET。如果攻击者在我们的网站上上传了一张图片,当用户加载图片时,实际上是向攻击者的服务器发送了一个请求。这个请求会有一个referer,表示当前图片所在页面的url。而如果使用GET接口的话,URL会是这样的:https://xxxx.com/gift?giftId=...,也就是说攻击者已经获得了_csrf_token,可以用来操作其他GET接口。由于网站存在XSS漏洞,用户的Cookie很容易被窃取,所以这个方案一定是安全的,没有XSS。DetectReferer:Referer,根据HTTP协议,在HTTP头中有一个叫做Referer的字段,记录了HTTP请求的源地址。通过检查Referer的值,如果服务器判断Referer不是本站的页面,而是外部站点的页面,那么我们就可以判断请求是非法的。该方法是为了实现防止图片盗链的原理。优点:这种方法最明显的优点就是简单易行。普通网站开发者无需担心CSRF漏洞。他们只需要在最后对所有安全敏感的请求添加一个拦截器来检查Referer值。尤其是对于目前已有的系统,不需要改变现有系统的任何现有代码和逻辑,没有风险,非常方便。缺点:Referer的值由浏览器提供。虽然HTTP协议中有明确的要求,但各个浏览器可能对Referer的实现不同,并不能保证浏览器本身没有安全漏洞。使用验证Referer值的方法是依靠第三方(即浏览器)来保证安全性。从理论上讲,这是不安全的。对于一些低版本的浏览器,已经有一些方法可以篡改HTTP头中的Referer值和自定义属性。此方法还使用令牌进行验证。与前面的方法不同,此方法不使用令牌作为参数。不要将它放在HTTP请求中,而是将它放在HTTP标头中的自定义属性中。通过XMLHttpRequest类,可以一次性为所有该类型的请求添加HTTP头属性csrftoken,并将token值放入其中。参考:CSRF(Cross-siteRequestForgery)的理解浅谈CSRF攻击方式XSS跨站脚本攻击和CSRF跨站请求伪造攻击学习总结。\CSRF攻击原理及nodejs的实现及应对CSRF攻击的对策