【问题标题】:c# mvc html.raw is allowing cross site scripting attackc# mvc html.raw 允许跨站点脚本攻击
【发布时间】:2018-10-27 18:59:15
【问题描述】:

我使用 MVC @Html.Raw 元素将 URL 保存到 javascript 变量中。但这会使我的 URL 容易受到 XSS 攻击。

如果有人将查询字符串设为:?budget=0-8";alert('a')//

我这样做:var url = "@Html.Raw("domain/?budget=0-8";alert('a')//")",它会在用户浏览器上提醒 'a'。

我怎样才能避免这种情况?

【问题讨论】:

  • 1. 为什么首先使用@Html.Raw()2. 限制您的输入类型:如果budget 需要一个范围,则在控制器级别将其解析为 2 个ints,或使用int budgetStartint budgetEnd。简而言之,不要让任意的string 数据进入您的视图。如果您的操作方法需要 string,请在到达视图之前将其解析为更严格的类型。
  • 如果你使用@Html.Raw(),你真的应该先清理输入。手动或查看一些外部库以提供帮助。
  • @haim770:我们正在使用@Html.Raw() 按原样传递查询字符串。如果我们不这样做,我们会得到编码字符。对于这种情况,@Html.Raw() 是否有任何替代方案?
  • @haim770:如果我使用 @HttpUtility.JavaScriptStringEncode("?budget=0-8";alert('a')//"),它会在这个字符串被编码时正常工作。但是这是正确的方法吗?

标签: asp.net-mvc xss


【解决方案1】:

.Net 核心

如果您的目标是将其作为 javascript 中的变量,则应在您的视图中使用 @Json.Serialize()JsonSerializerSettings.StringEscapeHandling = StringEscapeHandling.EscapeHtml

例子:

<script>
    var myQueryParams = @Json.Serialize(new { url = Model.SomeUserProvidedString }, new Newtonsoft.Json.JsonSerializerSettings() {StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml });
</script>

myQueryParams.url 将是一个 html 转义的 URL,并通过 Model.SomeUserProvidedString 阻止 XSS。


.Net 框架 MVC

Framework MVC 没有@Json.Serialize() - 如果您的包包含 Newtonsoft.Json,您可以重新创建此函数。这是基于open source .Net Core implementation of @Json

HtmlString SerializeToJson(object obj)
{
    var jsonString = Newtonsoft.Json.JsonConvert.SerializeObject(obj, new Newtonsoft.Json.JsonSerializerSettings() { StringEscapeHandling = Newtonsoft.Json.StringEscapeHandling.EscapeHtml })
    return new HtmlString(jsonString);
}

【讨论】:

  • 你确定吗?我找不到像 Json.Serialize 这样的东西?
  • 您使用的是什么版本的 MVC?我一直在 MVC 核心中使用Json.Serialize,但它只是 Newtonsoft.Json 的包装器,因此可以重新创建
  • MVC4 Asp.net,不是核心
  • 如果您的包有 Newtonsoft.Json,您可以重新创建该函数 - 请参阅我编辑的答案。
猜你喜欢
  • 2015-04-01
  • 2020-06-12
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2011-09-07
  • 2017-11-06
  • 2021-06-04
  • 1970-01-01
相关资源
最近更新 更多