如何获取反对派CsRF的HostName

时间:2015-12-28 08:23:51

标签: c# asp.net-mvc

对于反对党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)

1 个答案:

答案 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")]