3

如何在以下上下文中正确编码 JavaScript:

<html>
...
<script type="text/javascript">
var settings = @Html.PleaseEncode(settings.ToJson());
// ...
</script>
</html>

我的 JSON 对象中的值是由应用程序管理员设置的,所以我假设它们需要正确编码——对于 HTML 和 JavaScript。

我正在使用System.Web.Script.Serialization.JavaScriptSerializer进行 JSON 编码。看起来 JavaScriptSerializer 在将文本输出为 时进行了一些编码<None>\u003cNone\u003c但我不确定它有多安全。现在,我正在使用它,@Html.Raw因为它可以在安全输入的情况下工作。它生成以下内容:

var settings = {"UnselectedReason":"None Selected", /*...*/};

如果我使用@Html.Encode我会得到:

var settings = {&amp;quot;UnselectedReason&amp;quot;:&amp;quot;None Selected&amp;quot;, /*...*/};

我尝试过使用和不使用AntiXSS,但我认为这两种方式都没有区别。

4

5 回答 5

2

AntiXSS 有 JavaScriptEncode,但它是为单个项目设计的,而不是采用一整套错误的设置。

所以如果你传入 {"UnselectedReason":"None Selected", / ... /} 它会吃掉引号和其他东西,这可能不是你想要的。相反,我要做的是在您的 ToJson 中,我将使用字符串构建器构建设置,例如

StringBuilder sb = new StringBuilder();
sb.Append("{");
foreach(KeyValuePair kv in mySettings)
{
    sb.Append("\"");
    sb.Append(Microsoft.Security.Application.Encoder.JavaScriptEncode(kv.Key, true);
    sb.Append(":");
    sb.Append(Microsoft.Security.Application.Encoder.JavaScriptEncode(kv.Value, true);
    sb.Append("\",");
}

string outputString = sb.ToString().TrimEnd(",") + "}";

return new HtmlString(outputString);

注意:代码不在我的脑海中,甚至还没有输入到 VS 中。它说明了主体,可能无法编译!

于 2011-11-28T18:51:13.987 回答
1

如果您想使用 JS,为什么要对其进行编码?如果你有 json,它应该已经被编码了。由于它的 JS,您也不应该要求对其进行 html 编码。

我不相信你需要在这里编码,除非你能提供一个案例为什么而我只是错过了一些东西?

使用任何有效的 javascript,您都可能面临注入的风险,但由于您知道这是来自一些正在编码的有效来源(即模型),因此获取 JSON 的路径相对安全。

于 2011-11-28T18:47:37.297 回答
1

直接输出应该是安全的...

<script>//<![CDATA[<!--

var settings = @Html.Raw(settings.ToJson());

//-->]]></script

虽然如果你真的很担心......这假设一个现代浏览器或 json2.js 包括在内。

<script>

var settings = JSON.parse("@Html.Raw(Server.UrlEncode(settings.ToJson()))");

</script
于 2011-11-28T21:14:50.097 回答
0

这将是安全的。它不会破坏您的标记。

于 2011-11-28T18:47:02.617 回答
0

如果你确定你想做什么:

@Html.Raw(yourStringWithTheJSONcode)
于 2011-11-28T18:49:07.927 回答