攻擊過程和原理
-
用登錄口令成功登錄系統A,保留A系統cookie到瀏覽器。
-
登錄另一系統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解決方法
- 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 || {}, });
參考