asp.net-mvc - 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'。
我怎样才能避免这种情况?
解决方案
.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);
}
推荐阅读
- ruby-on-rails - ActiveRecord::Migration 类名中的方括号?
- php - 将许多文件上传到服务器的最佳方法
- json - JSON(在 SOAP UI 中——测试 WSO2 服务)
- php - 从 sendmail 更改为 sengdrid,现在邮件以垃圾邮件结尾
- java - 在 main 和 test maven 之间共享接口
- python-3.x - QStackedWidget - 逐页更改
- sql-server - 重写存储过程以按组返回第一个元素
- powershell - ArgumentOutOfRangeException 我不知道为什么
- javascript - html下拉列表自动打印所有按钮
- r - 如果我做两次 kmeans 会有什么不同?