Json.encode特殊符号\ u003c MVC3

Rom*_*man 8 javascript asp.net-mvc json escaping

我有JavaScript应用程序,我使用客户端模板(underscore.js,Backbone.js).

初始页面加载的数据被绑定到页面中(.cshtml Razor-file):

<div id="model">@Json.Encode(Model)</div>
Run Code Online (Sandbox Code Playgroud)

Razor引擎执行转义,如果Model是的话

new { Title = "<script>alert('XSS');</script>" }
Run Code Online (Sandbox Code Playgroud)

,在输出中我们有:

<div id="model">{&quot;Title&quot;:&quot;\u003cscript\u003ealert(\u0027XSS\u0027)\u003c/script\u003e&quot;}</div>
Run Code Online (Sandbox Code Playgroud)

其中"解析"后的操作:

var data = JSON.parse($("#model").html());
Run Code Online (Sandbox Code Playgroud)

我们有完整的"Title"字段对象数据"<script>alert('XSS');</script>"!

当这转到下划线模板时,它会发出警报.

不知何故,\u003c-像符号被视为正确的" <"符号.

我如何逃脱" <"符号&lt;,并&gt;从数据库(如果他们莫名其妙地到了那里)?

也许我可以调整Json.Encode序列化以逃避这些符号?也许我可以设置Entity Framework我正在使用的,以便在从DB获取数据时始终自动地逃避这些符号?

Tro*_*ord 2

\u003c 和类似的代码对于 JS 来说是完全有效的。如果您愿意,您可以使用此语法混淆整个 JS 文件。本质上,您看到的是转义字符 \、u 表示 unicode,然后是与符号相关的 4 字符十六进制代码。

http://javascript.about.com/library/blunicode.htm

\u003c - 正如您所注意到的,是 < 字符。

在 MVC 端“修复”此问题的一种方法是编写一个 RegEx 来查找模式 \u - 然后捕获接下来的 4 个字符。然后,您可以将它们取消编码为实际的 unicode 字符 - 并通过 XSS 预防算法运行生成的文本。

正如您在问题中所指出的 - 仅仅寻找“<”并没有帮助。您也不能只查找“\u003cscript” - 因为这假设潜在的黑客并没有简单地对整个“script”标签词进行 unicode 编码。更安全的方法是取消转义所有这些类型的代码,然后以纯文本形式清理 HTML。

顺便说一句,注意到这是 XSS 预防中常见的(迄今为止尚未解决的)问题之一,可能会让您感觉更好。所以你并不是唯一一个想要更好的解决方案的人......

您可以查看以下库来帮助实际的 html 清理:

http://wpl.codeplex.com/(微软尝试解决方案 - 尽管用户反馈非常糟糕) https://www.owasp.org/index.php/Category:OWASP_AntiSamy_Project_.NET(一个私人项目,旨在做了很多这样的预防。我发现它很难使用,并且在 .NET 中实现得很差)

不过,两者都是很好的参考。