Asp.net mvc ValidateInputAttribute在ASP.NET MVC控制器的Post请求中不工作
我的理解是OOTB,MVC将验证输入以防止XSS攻击和SQL注入 例如,在我的一个应用程序中,当我输入HTTP Get请求时,将接收到“已检测到危险输入”错误。但是,post操作可以让这些值通过html输入元素成功发布,而不会出错。甚至在我将控制器操作标记为[ValidateInputRue]之后。我如何让他们验证这些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注入,通过模型状态
任何建议都将不胜感激 如果没有看到你的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完成的字符串验证
更多信息:我完全同意。在那些东西上没有这样的属性。有时间我会进一步调查,稍后再通知你。