攻击过程和原理
-
用登录口令成功登录系统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 || {}, });
参考