3

次のコンテキストで JavaScript を適切にエンコードするにはどうすればよいですか。

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

JSON オブジェクトの値はアプリケーション管理者が設定するので、HTML と JavaScript の両方で適切にエンコードする必要があると思います。

JSONエンコーディングを行うためにSystem.Web.Script.Serialization.JavaScriptSerializerを使用しています。<None>JavaScriptSerializer は、テキストを として出力するときに何らかのエンコードを行っているように見えますが\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 に答える