Razorを使用して、エンコードされていないJsonをビューに書き込むにはどうすればよいですか?


153

次のように、Razorを使用してオブジェクトをJSONとしてAsp.Net MVCビューに書き込もうとしています。

<script type="text/javascript">
  var potentialAttendees = @Json.Encode(Model.PotentialAttendees);
</script>

問題は、出力でJSONがエンコードされ、ブラウザがそれを気に入らないことです。例えば:

<script type="text/javascript">
    var potentialAttendees = [{&quot;Name&quot;:&quot;Samuel Jack&quot;},];
</script>

RazorにエンコードされていないJSONを出力させるにはどうすればよいですか?

回答:


190

あなたがやる:

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

Beta 2より前のリリースでは、次のようにしました。

@(new HtmlString(Json.Encode(Model.PotentialAttendees)))

3
オブジェクトのプロパティにエンコードされたテキストが必要な場合はどうすればよいですか?\、{\ "UrlPart \":\ "TjcolklFX5c \"、\ "Title \":\ "When Mama Isn \ u0027t Home \"}、{\ "たとえば、jsは、 'がvar a = ''のネイティブ文字列のデカルレーション ""でも同じですanny idea?
SomeRandomName

javascriptserializerそのために 使用できる@SomeRandomName@Html.Raw(javascriptSerializerObjecct.Serialize(myObject))
vikscool 2017

私たちはMVC 5を使用して2017年にいますが、この答えはまだ完璧です!
ガブリエル

この答えは、完全に機能する唯一のものです。ありがとう!
Jean-Paul

43

NewtonsoftのJsonConvert.SerializeObject動作は同じではなく、Json.Encode@ david-k-eggheadが示唆する動作を実行すると、XSS攻撃に備えることができます。

このコードをRazorビューにドロップして、使用Json.Encodeが安全であること、およびJavaScriptコンテキストでNewtonsoftを安全にできることを確認しますが、追加の作業が必要です。

<script>
    var jsonEncodePotentialAttendees = @Html.Raw(Json.Encode(
        new[] { new { Name = "Samuel Jack</script><script>alert('jsonEncodePotentialAttendees failed XSS test')</script>" } }
    ));
    alert('jsonEncodePotentialAttendees passed XSS test: ' + jsonEncodePotentialAttendees[0].Name);
</script>
<script>
    var safeNewtonsoftPotentialAttendees = JSON.parse(@Html.Raw(HttpUtility.JavaScriptStringEncode(JsonConvert.SerializeObject(
        new[] { new { Name = "Samuel Jack</script><script>alert('safeNewtonsoftPotentialAttendees failed XSS test')</script>" } }), addDoubleQuotes: true)));
    alert('safeNewtonsoftPotentialAttendees passed XSS test: ' + safeNewtonsoftPotentialAttendees[0].Name);
</script>
<script>
    var unsafeNewtonsoftPotentialAttendees = @Html.Raw(JsonConvert.SerializeObject(
        new[] { new { Name = "Samuel Jack</script><script>alert('unsafeNewtonsoftPotentialAttendees failed XSS test')</script>" } }));
    alert('unsafeNewtonsoftPotentialAttendees passed XSS test: ' + unsafeNewtonsoftPotentialAttendees[0].Name);
</script>

以下も参照してください。


彼らがJson.Encodeを追加したときに何か考えがありますか?実際にページにjsonを挿入する安全な方法があることに気づかなかったし、過去に多くの研究をしたことは知っている。
Chris Marisic 16

1
Json.Encode私が覚えている限り存在しますが、欠点は、標準以外の日付を出力するMicrosoftの実装を使用していることです(他の厄介なことを行う可能性があります)。私はNewtonsoftを使用し、JsonConvert.SerializeObject適切なエスケープと組み合わせて使用することをお勧めします。
ジェレミークック

2
スクロールダウンしてよかった。受け入れられた回答をすぐに見て、これを行う安全な方法があることを望みました。
霜降りの素晴らしい

HttpUtility.JavaScriptStringEncodeバージョンはJSONの引用符もエンコードし、残念ながらスクリプト[type = 'application / json']で直接使用すると無効になります。
ピートカーカム2017

1
今後の自分への注意:使用したいのはこれです:@ Html.Raw(Json.Encode())
Pangamma

12

Newtonsoftの使用

<script type="text/jscript">
  var potentialAttendees  = @(Html.Raw(Newtonsoft.Json.JsonConvert.SerializeObject(Model.PotentialAttendees)))
</script>

1
これは、Json.Encodeが修正するXSS脆弱性に対して潜在的に脆弱ですが、JsonSerializerSettings.StringEscapeHandlingをオーバーライドしてエンコードを有効にすることができます。stackoverflow.com/a/50336590/6950124
Kevin Secrist
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.