Asp.net mvc ValidateInputAttribute在ASP.NET MVC控制器的Post请求中不工作

Asp.net mvc ValidateInputAttribute在ASP.NET MVC控制器的Post请求中不工作,asp.net-mvc,security,validation,xss,sql-injection,Asp.net Mvc,Security,Validation,Xss,Sql Injection,我的理解是OOTB,MVC将验证输入以防止XSS攻击和SQL注入 例如,在我的一个应用程序中,当我输入HTTP Get请求时,将接收到“已检测到危险输入”错误。但是,post操作可以让这些值通过html输入元素成功发布,而不会出错。甚至在我将控制器操作标记为[ValidateInputRue]之后。我如何让他们验证这些post输入 任何建议都将不胜感激 如果没有看到你的GET处理程序,或者你向它发送了什么,很难说它为什么会这样做。然而,OOTB MVC通过使用实体框架防止SQL注入,通过模型状态

我的理解是OOTB,MVC将验证输入以防止XSS攻击和SQL注入

例如,在我的一个应用程序中,当我输入HTTP Get请求时,将接收到“已检测到危险输入”错误。但是,post操作可以让这些值通过html输入元素成功发布,而不会出错。甚至在我将控制器操作标记为[ValidateInputRue]之后。我如何让他们验证这些post输入


任何建议都将不胜感激

如果没有看到你的GET处理程序,或者你向它发送了什么,很难说它为什么会这样做。然而,OOTB MVC通过使用实体框架防止SQL注入,通过模型状态验证防止XSS

在处理此表单提交的POST操作的主体中,您将希望使用类似以下代码:

if (ModelState.IsValid)
{
    //do the stuff I want to do when things are valid and free of XSS
}
else
{
    //something went wrong.  Probably shouldn't process this one.  Have the user try again
}

更新:请不要理会我肮脏的谎言。ValidateInputRue不是必需的,因为默认情况下它处于启用状态。因此,我唯一能想到的是,您的类或属性上有AllowHtml属性,或者您没有发回模型绑定的模型,因此也没有进行输入验证。此时,您可能需要编写一些代码以获得进一步的帮助。现在有太多的未知数。

我遇到了类似的问题-我们让JQuery使用$.ajax将JSON发布到MVC操作。默认模型绑定器不验证已发布的JSON,从而允许针对我们的操作发布不安全的XS

为了解决这个问题,我发现RequestValidator有一个静态方法invokeValidRequestString,它允许

public class ValidateJsonXssAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var request = filterContext.HttpContext?.Request;
        if (request != null && "application/json".Equals(request.ContentType, StringComparison.OrdinalIgnoreCase))
        {
            if (request.ContentLength > 0 && request.Form.Count == 0) // 
            {
                if (request.InputStream.Position > 0)
                    request.InputStream.Position = 0; // InputStream has already been read once from "ProcessRequest"
                using (var reader = new StreamReader(request.InputStream))
                {
                    var postedContent = reader.ReadToEnd(); // Get posted JSON content
                    var isValid = RequestValidator.Current.InvokeIsValidRequestString(HttpContext.Current, postedContent,
                        RequestValidationSource.Form, "postedJson", out var failureIndex); // Invoke XSS validation
                    if (!isValid) // Not valid, so throw request validation exception
                        throw new HttpRequestValidationException("Potentially unsafe input detected");
                }
            }
        }
    }
}
然后,您可以修改相关的MVC操作,以期望JSON发布的数据可能绕过标准XSS预防:

[HttpPost]
[ValidateJsonXss]
public ActionResult PublishRecord(RecordViewModel vm) { ... }
通过扩展RequestValidator对象,您可以看到使用OWASP.NET建议自定义请求验证的其他选项,该对象公开了MVC在查询字符串、表单集合和cookie值的其他场景中自动使用的ValidateInput完成的字符串验证


更多信息:

我完全同意。在那些东西上没有这样的属性。有时间我会进一步调查,稍后再通知你。