CSRF攻击防范Token解决


攻击过程和原理

  1. 用登录口令成功登录系统A,保留A系统cookie到浏览器。
  2. 登录另一系统B,B系统对A系统进行post数据提交(也可以对get请求发起类似的攻击,如果A系统对get请求也进行数据更新的话,这种风险有可能会发生),对系统数据进行更新。 n 攻防 防护 a) 使用Referer判断,判断请求头中的域名和配置的是否一致(IE5应该可以篡改Referer的值.黑客攻击时可能修改浏览器自动生成的Header头中的Referer,所以不能完全保证,同时referer验证还有其他问题)。 b) 使用Token判断,用户登录时根据用户名和密码等加密生成一个Token值,同时写入到浏览器的Cookie和Hidden中,然后根据每次的请求将Token和Cookie同时带入到服务端进行验证和判断。 d) ASP.NET中使用@Html.AntiForgeryToken(),框架自己会在Reponse时写入Cookie和Hidden的的Token值,在需要验证的Action上标记[ValidateAntiForgeryToken],在提交数据时框架会自动进行验证。 ASP.NET MVC 使用Token解决方法
  3. ASP.NET 在加密和解密时使用了加密和解密算法,所以对于单台服务器的话不用单独配置算法,有负载均衡的应用,对于生成token和提交验证token可能落在不同的服务器上,所以需要统一算法,否则会报【异常信息=无法解密防伪标记。如果此应用程序由 Web Farm 或群集承载】,需要在配置文件中增加
    <machineKey validationKey="3FF1E929BC0534950B0920A7B59FA698BD02DFE8" 
                    decryptionKey="280450BB36319B474C996B506A95AEDF9B51211B1D2B7A77" 
                    decryption="3DES" 
                    validation="SHA1"/>
    

      

/// <summary>
    /// Token验证
    /// </summary>
    public class TokenAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            if (request.HttpMethod == WebRequestMethods.Http.Post)
            {
                if (request.IsAjaxRequest())
                {
                    var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];
                    var cookieValue = antiForgeryCookie != null
                        ? antiForgeryCookie.Value
                        : null;
                    AntiForgery.Validate(cookieValue, request.Headers["authToken"]);
                }
                else
                {
                    new ValidateAntiForgeryTokenAttribute()
                        .OnAuthorization(filterContext);
                }
            }
        }
    }

  

 
form提交时hidden中的Token被自动提交,在ajax中需要单独传入Token,Cookie内容会自动携带
var token = $("[name='__RequestVerificationToken']").val() || "";
var useHeaders = {};
useHeaders["authToken"] = token;

 $.ajax({
            url: url,
            type: "POST",
            data: opts.data || {},
            dataType:"json",
            headers: useHeaders  || {},
});

  

 
参考


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM