gpt4 book ai didi

c# - 来自 JSON ajax post 的 MVC 操作的 XSS 验证

转载 作者:太空狗 更新时间:2023-10-29 22:25:25 29 4
gpt4 key购买 nike

在将 json 发布到 MVC 操作(例如来自 JQuery 的带有 json 内容的 $.ajax 发布)的情况下,是否有一种方法可以从 MVC 手动调用 XSS 检测,例如从过滤器中调用 XSS 检测?

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

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

虽然在客户端清理输入很容易,但我们显然还需要服务器验证才能抛出 5xx(可能是我可以包装在过滤器中以在可能受到影响的操作之间共享的东西)来强制执行此操作如果可能的话,使用默认模型绑定(bind)对 json 提交的输入进行危险代码检测,以避免重新发明轮子或将 html 编码的错误输入插入我们的数据库。

最佳答案

我找到了适合我情况的解决方案。在这种情况下,我们让 JQuery 使用 $.ajax 将 JSON 发布到 MVC 操作。默认模型 Binder 不验证发布的 JSON,允许针对我们的操作发布不安全的 XSS。

为了解决这个问题,我发现 RequestValidator 有一个静态方法 InvokeIsValidRequestString 允许验证特定的字符串以检测 XSS(因为到目前为止我找到的每个解决方案都重新发明了wheel here 并做了自己的 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 对象,它公开了由 MVC 自动用于查询字符串的其他场景的 ValidateInput 完成的字符串验证,表单集合和 cookie 值。

更多信息:https://www.owasp.org/index.php/ASP.NET_Request_Validation

如果有人有其他建议,我很乐意看到其他方法。

关于c# - 来自 JSON ajax post 的 MVC 操作的 XSS 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45846577/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com