4

この回答をもう必要としないようにコードを変更しましたが、好奇心のためにまだ尋ねています。

よく検索した結果、この質問と他のいくつかの質問が見つかりました。JsonResult によって返される JSON をビューで使用する方法を探していました。その答えや他の答えの問題は、それらが安全ではないように見えることです。私が見つけたいくつかの情報源は、次のようなものを提案しました:

@Html.Raw(Json.Encode(Model))

まず、Json.Encodeもう存在しないようです。次に、Raw を使用すると、JSON 構文がエンコードされないだけでなく、モデルのコンテンツもエンコードされません。ユーザー<script>が自分の情報にタグを入力すると、そのように吐き出されて実行されます。Raw を使用しない場合、JSON もビュー ライターによってエスケープされます。

これが必要だったのは、jQuery テンプレートを使用しているページがあり、最初の読み込み時に、テンプレートを起動するスクリプト タグをビューに出力させることで、引き続きテンプレートを使用したかったからです。

4

1 に答える 1

1

すべての JSON 出力を HMTL で安全に使用できるわけではないことは非常に良い観察です。実際、Json.NET のデフォルト構成を使用すると (これは素晴らしいことです)、XSS の脆弱性につながる可能性があります。

とにかく、そのような広告はありませんが、コンテキスト内の構成Json.Encode安全に使用できます。(結果は、単一引用符を使用する属性でも安全な「生」ですが、二重引用符を使用するか引用符を使用しない属性では安全ではありません。)@Html.Raw(Json.Encode(obj))<script>

これは、Json.Encode\u-encodingが JSON 文字列リテラルの<>&、および'文字に適用されるためです (ASCII 制御文字もエスケープされるため、XML でもうまく機能します)。例えば、

Json.Encode(new { hello = "\0\"\b\r\t<>&'" })

結果は

{"hello":"\u0000\"\b\r\t\u003c\u003e\u0026\u0027"}

メソッドがまだ存在するためJson.Encode、含まれているアセンブリ (System.Web.Helpers) または名前空間が正しく使用されていない可能性があります。

この質問が 3 年古いことはわかっていますが、この質問は短い検索で見つけた最高のものであり、手を振っている他の多くの情報源と同じように自分で答えを探すか、問題を完全に無視する必要がありました..そうそう、ネクロマンサーのバッジが欲しい。

于 2015-12-09T23:13:33.707 に答える