我们正在使用ASP.NET MVC 5.0来构建一个网站。如果我在保存时输入一些文本框,我会得到一个"检测到可能不安全的输入"错误页面 - 很棒。
然而,我们的几个屏幕使用ajax提交将json直接传递给控制器,这似乎跳过了上面的验证。
是否有任何方法可以在控制器中调用模型(或模型中的每个文本字段)上的标准验证,以便抛出上述错误。 即
之类的东西 public override ActionResult Create(MyModel myModel)
{
/* Any dubious input this should throw an error*/
AntiXSS.ValidateInput(myModel);
...
答案 0 :(得分:0)
我遇到了类似的问题,正如其他答案的评论中所述,我们使用RequestValidator
的JQuery将JSON发布到MVC操作。默认模型绑定程序不验证发布的JSON,允许根据我们的操作发布不安全的XSS。
要解决此问题,我发现InvokeIsValidRequestString
有一个允许的静态方法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");
}
}
}
}
}
[HttpPost]
[ValidateJsonXss]
public ActionResult PublishRecord(RecordViewModel vm) { ... }
然后,您可以装饰相关的MVC操作,期望可能绕过标准XSS预防的JSON发布数据:
ValidateInput
您可以通过扩展RequestValidator对象来查看使用OWASP .NET建议自定义请求验证的其他选项,该对象公开由MVC自动使用的{{1}}完成的字符串验证,用于查询字符串,表单集合的其他方案,和cookie值。
了解更多信息:https://www.owasp.org/index.php/ASP.NET_Request_Validation
答案 1 :(得分:-1)
[ValidateInput]属性可以附加到每个方法。 http://www.c-sharpcorner.com/UploadFile/dacca2/validateinput-attribute-to-prevent-css-attack-in-mvc/