Web站点为什么会遭受攻击?是为了恶作剧?损害企业名誉?免费浏览收费内容?盗窃用户隐私信息?获取用户账号谋取私利?总之攻击方式层出不穷,作为Web开发框架来说,帮助开发者做好解决安全问题也是刻不容缓的,本篇文章来告诉大家怎么禁止CSRF跨站请求伪造。
WEb开发框架适用范围
Web网站
攻击原理
如果B/S开发框架中不做防范,完成一次CSRF跨站请求伪造,受害者必须依次完成两个步骤:
1.登录受信任网站A,并在本地生成Cookie。
2.在不登出A的情况下,访问危险网站B。
看到这里,你也许会说:“如果我不满足以上两个条件中的一个,我就不会受到CSRF的攻击”。是的,确实如此,但你不能保证以下情况不会发生:
1.你不能保证你登录了一个网站后,不再打开一个tab页面并访问另外的网站。
2.你不能保证你关闭浏览器了后,你本地的Cookie立刻过期,你上次的会话已经结束。(事实上,关闭浏览器不能结束一个会话,但大多数人都会错误的认为关闭浏览器就等于退出登录/结束会话了......)
3.CSRF攻击是源于WEB的隐式身份验证机制!WEB的身份验证机制虽然可以保证一个请求是来自于某个用户的浏览器,但却无法保证该请求是用户批准发送的。
解决方案
应用程序处理
1、验证 HTTP Referer 字段;根据HTTP协议,在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址。提交请求是来自网站自己的请求,是合法的。如果Referer是其他网站的话,就有可能是CSRF攻击,则拒绝该请求。
2、在请求地址中添加 token 并验证;CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于Cookie中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的Cookie来通过安全验证。鉴于此,系统开发者可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。
3、云微开发平台在 HTTP 头中自定义属性并验证。自定义属性的方法也是使用token并进行验证,和前一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP 头中自定义的属性里。通过XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把token值放 入其中。这样解决了前一种方法在请求中加入token的不便,同时,通过这个类请求的地址不会被记录到浏览器的地址栏,也不用担心token会通过 Referer泄露到其他网站。
4、使用ASP.NET环境的Anti CSRF模块-AntiCSRF。
管理处理
适用于web开发框架ASP.NET环境的Anti CSRF模块-AntiCSRF。
在webconfig配置文件中添加配置
<configuration> <configSections> <sectionname="csrfSettings"type="Idunno.AntiCsrf.Configuration.CsrfSettings, Idunno.AntiCsrf" /> </configSections> <csrfSettingscookieName="__CSRFCOOKIE"formFieldName="__CSRFTOKEN"detectionResult="RaiseException"errorPage="404.aspx" /> <system.webServer> <modules> <addname="AntiCSRF"type="Idunno.AntiCsrf.AntiCsrfModule, Idunno.AntiCsrf" /> </modules> </system.webServer> </configuration>
物理处理
无
Web站点为什么会遭受攻击?是为了恶作剧?损害企业名誉?免费浏览收费内容?盗窃用户隐私信息?获取用户账号谋取私利?总之攻击方式层出不穷,作为B/S开发框架来说,帮助开发者做好解决安全问题也是刻不容缓的,本篇文章来告诉大家怎么禁止CSRF跨站请求伪造。