首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自JSON ajax post的MVC操作的XSS验证

来自JSON ajax post的MVC操作的XSS验证
EN

Stack Overflow用户
提问于 2017-08-23 18:02:55
回答 1查看 3.9K关注 0票数 7

是否有一种方法可以手动调用来自MVC的XSS检测,例如在json被发布到MVC操作时(比如$.ajax发布来自JQuery的带有json内容的文章)?

我们正在使用MVC 5,并且在捕获XSS (“潜在不安全的输入检测到”)的标准MVC机制上没有问题,但是一些应用程序使用$.ajax将JSON ("application/json“内容类型)发布到MVC操作中。在这些情况下,我们注意到XSS检测没有运行,并且允许危险的表单输入。

在我们对类似问题的调查和研究中,我们发现默认模型绑定器中的JsonValueProviderFactory对于表单提交或查询字符串输入中存在的XSS安全性没有相同的调用。

虽然对客户端的输入进行清理很容易,但我们显然也需要服务器验证,以便抛出一个5xx (可能的话,我可以将它封装在过滤器中,以共享可能受到影响的操作),以强制对json提交的带有默认模型绑定的输入进行这种危险的代码检测,如果可能的话,以避免重新调用车轮或将html编码的错误输入插入到我们的数据库中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-24 01:49:13

我找到了一个适合我情况的解决方案。在本例中,我们让JQuery使用$.ajax将JSON发布到MVC操作。默认的模型绑定程序不验证已发布的JSON,允许针对我们的操作发布不安全的XSS。

为了解决这个问题,我发现RequestValidator有一个静态方法InvokeIsValidRequestString,它允许验证一个特定的字符串来检测XSS (因为到目前为止,我找到的每个解决方案都重新发明了这里的轮子,并且拥有XSS对白色/黑名单的检查)。然后,只需将操作限制在适当的场景中,获取已发布的JSON,并在检测到XSS时抛出验证错误。

代码语言:javascript
复制
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预防:

代码语言:javascript
复制
[HttpPost]
[ValidateJsonXss]
public ActionResult PublishRecord(RecordViewModel vm) { ... }

幸运的是,我偶然发现了OWASP .NET建议,其中它建议扩展RequestValidator对象,该对象公开了ValidateInput为查询字符串、表单集合和cookie值的其他场景自动使用的ValidateInput所做的字符串验证。

欲了解更多信息:Validation

如果有人有其他的建议,我希望看到其他的方法。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45846577

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档