csrf攻击 什么是CSRF?如何防御CSRF攻击?知了堂告诉你
要研究网络安全,我们必须了解CSRF,那么什么是CSRF呢?我们应该如何防御CSRF的袭击?边肖在这里整理CSRF的介绍、原理和防守方法,帮助大家了解CSRF。
1.什么是CSRF?
Csrf,也称为一键式攻击或会话骑行,CSRF,攻击者就可以强制Web应用的用户执行攻击者预设的操作。
因此,当遇到CSRF攻击时,会对终端用户的数据和操作指令造成严重威胁。当被攻击的终端用户拥有管理员帐户时,CSRF攻击将危及整个Web应用程序。
第二,CSRF原则
1.用户c打开浏览器,访问可信网站a,通过输入用户名和密码请求登录网站a;
2.用户信息验证后,网站A生成Cookie信息并返回给浏览器。此时用户成功登录网站A,可以正常向网站A发送请求;
3.在用户退出网站A之前,在同一浏览器中打开一个TAB页面访问网站B;
4.网站B收到用户请求后,返回一些攻击性代码,发送访问第三方网站A的请求;
5.收到这些攻击代码后,根据网站B的请求,浏览器在用户不知情的情况下携带Cookie信息,向网站A发送请求,网站A并不知道该请求实际上是由B发起的,因此会根据用户C的Cookie信息,以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF进攻的三个条件:
1.用户已登录站点a,并在本地记录了cookie
2.当用户未注销站点A时,访问恶意攻击者提供的引诱危险站点B。
3.现场甲没有做任何CSRF防御
三、CSRF的防御方法
2.POST请求通常用于提交From表单、更改资源属性或执行其他操作
检查HTTP引用者字段
HTTP头中有一个Referer字段,用于指示请求来自哪个地址。处理敏感数据请求时,在正常情况下,Referer字段应位于与请求地址相同的域名下,例如需要访问http://bank.example/withdraw?账户= bob & amp金额=1000000英镑。对于=马洛里,用户必须首先登录银行。例如,然后单击页面上的按钮来触发转账事件。此时,转移请求的Referer值将是转移按钮所在页面的URL,通常是以域名银行开头的地址..然而,如果黑客想对银行网站进行CSRF攻击,他只能在自己的网站上构造一个请求。当用户通过黑客的网站向银行发送请求时,请求的Referer指向黑客自己的网站。因此,为了抵御CSRF攻击,银行网站只需为每个转账请求验证其Referer值。如果是以bank.example开头的域名,则表示请求来自银行网站本身,是合法的。如果引荐者是另一个网站,它可能是黑客的CSRF攻击,请求被拒绝。
这种方法的明显优点是简单易行。普通的网站开发者不需要担心CSRF漏洞,只需要在所有安全敏感的请求中添加一个拦截器来检查Referer的值。特别是对于目前现有的系统,不需要改变现有系统的任何现有代码和逻辑,没有风险,非常方便。
然而,这种方法并不是万无一失的。Referer的值由浏览器提供。虽然HTTP协议中有明确的要求,但Referer的具体实现可能会因浏览器而异,并不能保证浏览器没有安全漏洞。验证Referer值的方法意味着安全性依赖于第三方,这在理论上是不安全的。事实上,对于某些浏览器,比如IE6或FF2,已经有一些方法可以篡改Referer值。如果bank.example网站支持IE6浏览器,黑客可以将用户浏览器的Referer值设置为以bank.example域名开头的地址,这样就可以通过验证,进行CSRF攻击。
即使使用最新的浏览器,黑客也无法篡改Referer值,这种方法仍然存在问题。由于Referer值记录了用户的访问来源,一些用户认为这样会侵犯他们的隐私权,特别是一些组织担心Referer值会将组织内部网络中的一些信息泄露给外部网络。因此,用户自己可以设置浏览器,使其在发送请求时不再提供Referer。当他们正常访问银行网站时,网站会认为是CSRF攻击,因为该请求没有Referer值,并拒绝合法用户的访问。
自定义HTTP头中的属性并验证它们
此方法还使用令牌并对其进行验证。与前面的方法不同,令牌不是作为参数放在HTTP请求中,而是放在HTTP头的自定义属性中。使用这个类,您可以一次将csrftoken添加到这个类的所有请求中,并将令牌值放入其中。这样就解决了向请求中添加令牌的不便。同时,请求的地址不会记录在浏览器的地址栏中,也不用担心令牌会通过Referer泄露给其他网站。
然而,这种方法有很大的局限性。在Ajax方法中,请求通常用于异步页面刷新。并不是所有的请求都适合由这个类发起,而且这类请求获得的页面也无法被浏览器记录下来,用户前进、后退、刷新、收藏都不方便。此外,对于没有CSRF保护的遗留系统,采用这种保护方式,需要将所有请求都变成请求,这几乎意味着要重写整个网站,这无疑是不可接受的。
2.客户辩护
由于攻击者成功执行CSRF攻击的请求是由浏览器发出的,因此可以创建客户端工具来保护用户免受此类攻击。现有工具RequestRodeo通过充当客户端和服务器之间的代理来防止CSRF攻击。如果RequestRodeo发现一个它认为非法的请求,它将从请求中剥离身份验证信息。虽然这个公式在很多情况下是有效的,但它也有一些局限性。具体来说,当客户端使用SSL身份验证或使用JavaScript生成一些页面时,它将不起作用。
人们开发了一种浏览器插件,它不仅可以保护用户免受某些类型的CSRF攻击,还可以克服上述限制。这个工具是作为Firefox浏览器的扩展实现的,它的地址是http://www.cs.princeton.edu/.的wzeller/csrf/protector/为了有效防止csrf攻击,用户需要下载并安装这个扩展。该扩展拦截所有HTTP请求,并确定是否允许该HTTP请求。本判决应采用以下规则。
首先,除了POST请求之外的任何事情都是允许的。第二,如果请求站点和目标站点满足同源策略的要求,则请求被允许。第三,如果请求站点被允许使用Adobe的跨域策略建立请求,该请求也将被允许。如果我们的扩展拒绝了一个请求,它将通过一个公共界面提示用户该请求已被阻止,并让用户选择是否将该网站添加到白名单中。
该扩展仅拦截开机自检请求。这意味着它不能保护用户免受使用GET请求的CSRF攻击。防止这种类型攻击的唯一方法是不允许任何跨域GET请求,或者一次只允许用户登录一个站点,但这两个限制可能是用户无法忍受的。