是否有一种方法可以手动调用来自MVC的XSS检测,例如在json被发布到MVC操作时(比如$.ajax发布来自JQuery的带有json内容的文章)?
我们正在使用MVC 5,并且在捕获XSS (“潜在不安全的输入检测到”)的标准MVC机制上没有问题,但是一些应用程序使用$.ajax将JSON ("application/json“内容类型)发布到MVC操作中。在这些情况下,我们注意到XSS检测没有运行,并且允许危险的表单输入。
在我们对类似问题的调查和研究中,我们发现默认模型绑定器中的JsonValueProviderFactory对于表单提交或查询字符串输入中存在的XSS安全性没有相同的调用。
虽然对客户端的输入进行清理很容易,但我们显然也需要服务器验证,以便抛出一个5xx (可能的话,我可以将它封装在过滤器中,以共享可能受到影响的操作),以强制对json提交的带有默认模型绑定的输入进行这种危险的代码检测,如果可能的话,以避免重新调用车轮或将html编码的错误输入插入到我们的数据库中。
发布于 2017-08-24 01:49:13
我找到了一个适合我情况的解决方案。在本例中,我们让JQuery使用$.ajax将JSON发布到MVC操作。默认的模型绑定程序不验证已发布的JSON,允许针对我们的操作发布不安全的XSS。
为了解决这个问题,我发现RequestValidator有一个静态方法InvokeIsValidRequestString,它允许验证一个特定的字符串来检测XSS (因为到目前为止,我找到的每个解决方案都重新发明了这里的轮子,并且拥有XSS对白色/黑名单的检查)。然后,只需将操作限制在适当的场景中,获取已发布的JSON,并在检测到XSS时抛出验证错误。
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) { ... }幸运的是,我偶然发现了OWASP .NET建议,其中它建议扩展RequestValidator对象,该对象公开了ValidateInput为查询字符串、表单集合和cookie值的其他场景自动使用的ValidateInput所做的字符串验证。
欲了解更多信息:Validation
如果有人有其他的建议,我希望看到其他的方法。
https://stackoverflow.com/questions/45846577
复制相似问题