最近帮别人“擦屁股”,做了全局CSRF漏洞修复,针对各种表单,作如下分享(html 为通用方法):
#############################
1.webform
这种情况只需加载一个DLL(Idunno.AntiCsrf.dll),配置web.config即可。
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="csrfSettings" type="Idunno.AntiCsrf.Configuration.CsrfSettings, Idunno.AntiCsrf" />
</configSections>
<csrfSettings cookieName="__CSRFCOOKIE" formFieldName="form1" detectionResult="RaiseException" errorPage="" />
<system.web>
//iis6
<httpModules>
<add name="AntiCSRF" type="Idunno.AntiCsrf.AntiCsrfModule, Idunno.AntiCsrf"/>
</httpModules>
//iis7
<modules>
<add name="AntiCSRF" type="Idunno.AntiCsrf.AntiCsrfModule, Idunno.AntiCsrf"/></modules>
</system.web>
</configuration>
</xml>
另外一种方法,自己看链接去:
http://www.cnblogs.com/luminji/archive/2012/06/08/2511384.html
#############################
2.mvc
基本思路是利用Token解决,这里只提供思路
前台页面(cshtml):@Html.AntiForgeryToken()
后台(Controllers):[ValidateAntiForgeryToken](详细看别人的链接去:http://my.oschina.net/wzzz/blog/118712 )
按照这个微软提供的Token并不能解决问题,发现每次如果抓报文后,依然可以进行二次请求。因Token的验证机制是页面生成时,临时生成一个隐藏域及value值,和一个cookie,提交表单后根据(Request.Form["__RequestVerificationToken"]及cookie值进行计算对比),然而每次请求后微软自带Token未销毁,或者说,仅针对客户端参数做了验证。