针对 CSRF 漏洞的防范 [c#,html,webform,mvc,,app api]

最近帮别人“擦屁股”,做了全局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未销毁,或者说,仅针对客户端参数做了验证。

解决办法:


protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var httpCookie = Request.Cookies["__RequestVerificationToken_Lw__"];
            if (httpCookie != null)
            {
                string cookieRVT = httpCookie.Value;
                string rvt = Request.Form["__RequestVerificationToken"];
                if (!string.IsNullOrEmpty(rvt))
                {
                    if (this.HttpContext.Session["cookieRVT"] != null && this.HttpContext.Session["rvt"] != null)
                    {
                        string temp1 = (string) this.HttpContext.Session["cookieRVT"];
                        string temp2 = (string)this.HttpContext.Session["rvt"];
                        if (cookieRVT == temp1 && rvt == temp2)
                            filterContext.Result = new RedirectResult("/Node/page");
                    }
                }
            }
        }

        protected override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var httpCookie = Request.Cookies["__RequestVerificationToken_Lw__"];
            if (httpCookie != null)
            {
                 string cookieRVT = httpCookie.Value;
                string rvt = Request.Form["__RequestVerificationToken"];
                if (!string.IsNullOrEmpty(rvt) && !string.IsNullOrEmpty(cookieRVT))
                {
                    this.HttpContext.Session["cookieRVT"] = cookieRVT;
                    this.HttpContext.Session["rvt"] = rvt;
                }

            }       

         }

#############################

3.html

抛个思路吧,类似上面的cookie及 post 参数验证, 加载页面的同时 web端给定两个值,cookie及异步填充到隐藏域的值(token表示吧),服务器端给定两个session存储cookie,token。注意的是这两个值是 通过同一个字符串不同的加密方式生成的。提交数据的时候需要提交隐藏域的值,在服务器获取cookie 及token做解密或者加密,只要验证这两个参数是由同一个字符串加密生成的就ok,有且仅当验证通过,并且cookie,token不等于session存储值,则视为合法请求,把获取的值赋值给session;否则视为非法请求,直接pass请求。


#############################

4.app 接口

看了下百度对于app应用,csrf防范,有了基本思路

noncestring防范CSRF攻击的安全认证参数。在轻应用服务器端生成的随机串,长度小于32。
csrftokenstring防范CSRF攻击的安全认证参数。在轻应用服务器端按照如下规则生成:md5(nonce + 轻应用的Secret Key)

思路:用户登陆成功后返回一个轻应用的Secret Key(也就意味着每次登陆Secret Key都不一样,服务器端存session),app每次请求之前请求一次安全认证参数(可逆加密,服务器端存session),就拿百度的参数nonce来举例吧,发送请求的时候带参数csrftoken,服务器端验证,通过后执行请求并修改掉nonce及secret key的session值。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页