我将尝试描述一种情况。 我有一个MVC项目,该项目已从要使用该项目的公司进行了安全审核。 他们遇到的问题是他们使用适当的帐户合法登录到站点并获得2个cookie(.ASPXAUTH和ASP.NET_SessionId)
接下来,他们寻找我对用jquery调用的方法的调用之一。基本上,API链接到POST方法。
接下来,他们复制合法令牌并创建一个JS文件,并在同一台PC上(可能是在同一浏览器上)调用我的方法,并且该方法可以正常工作,并且它们像在Jquery调用中一样发布一些内容。
现在他们告诉我这不好,我应该添加一个防伪令牌。好的,到目前为止。
因此,我在项目中的每个Razor页面上都添加了防伪令牌,例如@Html.AntiForgeryToken()
,而且我找到了一种在每个ajax请求中添加令牌的方法:
$(document).ready(function () {
$.ajaxSetup({
beforeSend: function (xhr) {
xhr.setRequestHeader("__RequestVerificationToken", $('input[name=__RequestVerificationToken]').val());
}
});
});
在MVC方面,我像这样检查它:
public sealed class ValidateHeaderAntiForgeryTokenAttribute : FilterAttribute, IAuthorizationFilter
{
public void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
var httpContext = filterContext.HttpContext;
var cookie = httpContext.Request.Cookies[AntiForgeryConfig.CookieName];
var token = httpContext.Request.Headers["__RequestVerificationToken"];
if (token == null)
token = "";
AntiForgery.Validate(cookie != null ? cookie.Value : null, token);
}
}
在我要检查的所有方法/控制器上,我添加了[ValidateHeaderAntiForgeryToken]
,效果很好。没有令牌,没有玩耍。简单又好。
因此,我很高兴进行更新,并要求他们再次进行测试。
他们做同样的事情,登录,转到调用我的POST API方法的页面,并复制所有cookie(现在又复制一个),然后再次运行其脚本即可。
通常情况下,由于该站点是通过HTTPS进行的,因此他们无法获取任何Cookie。
那么,有什么办法可以防止这种情况发生?还是他们的要求可笑?因为如果要删除其用户,他们将根本不会获得任何cookie或令牌。
在此先感谢您的帮助。