ASP.NET MVC XSS验证

时间:2015-05-18 16:08:41

标签: xss asp.net-mvc

我们正在使用ASP.NET MVC 5.0来构建一个网站。如果我在保存时输入一些文本框,我会得到一个"检测到可能不安全的输入"错误页面 - 很棒。

然而,我们的几个屏幕使用ajax提交将json直接传递给控制器​​,这似乎跳过了上面的验证。

是否有任何方法可以在控制器中调用模型(或模型中的每个文本字段)上的标准验证,以便抛出上述错误。 即

之类的东西
 public override ActionResult Create(MyModel myModel)
 {
     /* Any dubious input this should throw an error*/
     AntiXSS.ValidateInput(myModel);
     ...

2 个答案:

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