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