Làm cách nào để viết Json chưa được mã hóa vào Chế độ xem của tôi bằng Dao cạo?


153

Tôi đang cố gắng viết một đối tượng dưới dạng JSON vào Chế độ xem Asp.Net MVC của mình bằng cách sử dụng Dao cạo, như vậy:

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

Vấn đề là ở đầu ra JSON được mã hóa và trình duyệt của tôi không thích nó. Ví dụ:

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

Làm cách nào để có được Dao cạo để phát JSON chưa được mã hóa?

Câu trả lời:


190

Bạn làm:

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

Trong các bản phát hành sớm hơn Beta 2, bạn đã làm như sau:

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

3
Tôi có thể làm gì nếu tôi muốn một số văn bản được mã hóa trong thuộc tính đối tượng của mình? \, {\ "UrlPart \": \ "TjcolklFX5c \", \ "Tiêu đề \": \ "Khi Mama Isn \ u0027t Trang chủ \"}, {\ "Ví dụ: Điều này sẽ phá vỡ vì js nghĩ rằng 'đang thoát khỏi Phân phối chuỗi gốc của var a = '' giống với "". anny idea?
Một sốRandomName

@SomeRandomName bạn có thể sử dụng javascriptserializernhư thế @Html.Raw(javascriptSerializerObjecct.Serialize(myObject))
vikscool

Chúng tôi đang ở trong năm 2017, sử dụng MVC 5 và câu trả lời này vẫn hoàn hảo!
Gabriel Espinoza

Câu trả lời này là duy nhất hoạt động hoàn hảo. Cảm ơn!
Jean-Paul

43

Newtonsoft JsonConvert.SerializeObjectkhông hành xử giống như Json.Encodevà làm những gì @ david-k-egghead gợi ý mở ra cho bạn các cuộc tấn công XSS .

Thả mã này vào chế độ xem Dao cạo để thấy rằng việc sử dụng Json.Encodelà an toàn và Newtonsoft có thể được làm cho an toàn trong ngữ cảnh JavaScript nhưng không phải không có thêm một số công việc.

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

Xem thêm:


Bạn có ý tưởng gì khi họ thêm Json.Encode không? Tôi đã không biết rằng thực sự có một cách an toàn để chèn json vào trang và tôi biết rằng tôi đã nghiên cứu rất nhiều về nó trong quá khứ.
Chris Marisic

1
Json.Encodeđã tồn tại chừng nào tôi có thể nhớ, nhưng nhược điểm là nó sử dụng triển khai của Microsoft tạo ra các ngày không chuẩn (và có thể làm những việc khó chịu khác). Tôi sử dụng và khuyến khích việc sử dụng Newtonsoft JsonConvert.SerializeObjectkết hợp với thoát hiểm thích hợp vì nó có đầu ra tốt hơn.
Jeremy Cook

2
Vui mừng tôi cuộn xuống. Ngay lập tức tôi thấy câu trả lời được chấp nhận, tôi hy vọng có một cách an toàn để làm điều này.
frostymarvelous

Phiên bản HttpUtility.JavaScriptStringEncode cũng mã hóa các dấu ngoặc kép trong JSON, khiến nó không hợp lệ nếu được sử dụng trực tiếp trong tập lệnh [type = 'application / json'], thật đáng tiếc.
Pete Kirkham

1
Lưu ý cho bản thân trong tương lai: Ứng dụng bạn muốn sử dụng là: @ Html.Raw (Json.Encode ())
Pangamma

12

Sử dụng Newtonsoft

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

1
Điều này có khả năng dễ bị tổn thương đối với các lỗ hổng XSS mà Json.Encode sửa, nhưng bạn có thể ghi đè lên JsonSerializerSettings.StringEscapeHandlingđể bật mã hóa. stackoverflow.com/a/50336590/6950124
Kevin Secrist
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.