对于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"
更改为daynamicly。我不想使用静态字符串。我该怎么做 ?
如果使用以下代码,则始终为
true
if (filterContext.HttpContext.Request.UrlReferrer.Host!= filterContext.HttpContext.Request.UrlReferrer.Host)
最佳答案
没有理由实施您自己的系统。
有一个内置的机制,该机制具有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")]
关于c# - 如何获取反对CsRF的主机名,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34490018/