对于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/

10-13 09:29