首页 > 解决方案 > c# mvc html.raw 允许跨站点脚本攻击

问题描述

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

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

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

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

标签: asp.net-mvcxss

解决方案


.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.


.Net 框架 MVC

Framework MVC 没有@Json.Serialize()- 如果您的包包含 Newtonsoft.Json,您可以重新创建此功能。这是基于开源 .Net Core 实现的@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);
}

推荐阅读