web-dev-qa-db-ja.com

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

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

<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を送信させるにはどうすればよいですか?

145
Samuel Jack

あなたがやる:

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

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

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

NewtonsoftのJsonConvert.SerializeObjectJson.Encodeと同じように動作せず、@ david-k-eggheadが示唆することを行うと、XSS攻撃にさらされます

このコードをRazorビューにドロップして、Json.Encodeの使用が安全であり、NewtonsoftがJavaScriptコンテキストで安全にできることを確認しますが、余分な作業は必要ありません。

<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>

こちらもご覧ください:

41
Jeremy Cook

Newtonsoftの使用

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