对于反对党CSRF,我使用以下过滤器:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext.HttpContext != null)
{
if (filterContext.HttpContext.Request.UrlReferrer == null)
throw new System.Web.HttpException("Invalid submittion !");
if (filterContext.HttpContext.Request.UrlReferrer.Host.ToLower() != "www.mysite.com")
throw new System.Web.HttpException("this form wasn't submitting from this site !");
}
base.OnAuthorization(filterContext);
}
但是我想要改变"mysite.com"
。
我不想使用静态字符串。我该怎么做 ?
如果使用以下代码,则始终为true
if (filterContext.HttpContext.Request.UrlReferrer.Host!= filterContext.HttpContext.Request.UrlReferrer.Host)
答案 0 :(得分:2)
没有理由实施自己的系统。
在发布到方法的表单中有一个内置ValidateAntiForgeryToken
属性和@Html.AntiForgeryToken()
的内置机制。
Here is一本小手册。
您可以在页面中添加令牌:
@using(Html.Form("UserProfile", "SubmitUpdate"))
{
@Html.AntiForgeryToken()
<!-- rest of form goes here -->
}
以声明的方式在控制器的方法中检查它:
[ValidateAntiForgeryToken]
public ViewResult SubmitUpdate()
{
// ... etc
}
实际页面如下所示:
<form action="/UserProfile/SubmitUpdate" method="post">
<input name="__RequestVerificationToken" type="hidden" value="saTFWpkKN0BYazFtN6c4YbZAmsEwG0srqlUqqloi/fVgeV2ciIFVmelvzwRZpArs" />
<!-- rest of form goes here -->
</form>
您还可以在令牌中添加盐:
@Html.AntiForgeryToken("someArbitraryString")
[ValidateAntiForgeryToken(Salt="someArbitraryString")]