2012-05-25 31 views
19

Sử dụng Json.NETJson.NET SerializeObject giá trị thoát để ngăn ngừa XSS

JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }) 

lợi nhuận

{"Property":"<script>alert('o hai');</script>"} 

Có thể cho giá trị để được thoát bởi SerializeObject để ngăn chặn một kịch bản thù địch từ thực hiện? Tôi không muốn thay đổi đối tượng.

Chỉnh sửa: Lý tưởng nhất là tôi muốn tích hợp việc khử trùng vào cuộc gọi SerializeObject mà không phải xử lý đối tượng trước hoặc sau SerializeObject.

Chỉnh sửa: Đầu ra chuỗi từ JsonConvert.SerializeObject được gán cho biến toàn cục trong khối tập lệnh, mà tôi tin là vấn đề XSS.

Trả lời

15

này có thể không lý tưởng nhưng đây là giải pháp của tôi (bây giờ, ít nhất):

JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, new HtmlEncodeStringPropertiesConverter()); 

với một JsonConverter đơn giản mà thực hiện HtmlEncode trên giá trị nếu nó là một chuỗi

public class HtmlEncodeStringPropertiesConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(string); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteValue(Encoder.HtmlEncode(value.ToString())); 
    } 
} 

(EncoderMicrosoft.Security.Application.Encoder từ thư viện AntiXSS)

+0

Rất tiếc, bình luận vô dụng trước đó. – TheMonarch

+0

Bạn có ví dụ về obj = JsonConvert.DeserializeObject (json, settings); – MarzSocks

5

Không, JSON.NET là trình nối tiếp JSON. Nó không phải là một chất khử trùng XSS. Bạn có thể xem thư viện AntiXSS từ Microsoft. Dưới đây là một số article on MSDN về cách sử dụng của nó (một chút lỗi thời nhưng vẫn có liên quan).

+1

Tôi đã thử AntiXSS nhưng tôi đã không tìm thấy cách để làm cho nó không khử trùng quá nhiều khi xử lý chuỗi trả về bởi 'JsonConvert.SerializeObject (đối tượng)'. Nếu tôi có thể nhận được mã hóa AntiXSS để chỉ chạy trên các giá trị thuộc tính mà có lẽ sẽ làm điều đó. – kendaleiv

30

Chức năng để đạt được điều này đã được thêm vào trong version 4.5.11

Điều này cho phép bạn thêm loại thoát khác nhau vào đầu ra.

Đây là thử nghiệm LinqPad tôi:

var settings = new JsonSerializerSettings(); 

    settings.StringEscapeHandling = StringEscapeHandling.EscapeHtml; 

    var output = JsonConvert.SerializeObject(new { Property = "<script>alert('o hai');</script>" }, settings); 

    Debug.Print(output); 

đầu ra

{"Property":"\u003cscript\u003ealert(\u0027o hai\u0027);\u003c/script\u003e"} 

Cũng giống như một sự từ bỏ, đây không phải là một viên đạn vàng để sửa chữa XSS, nhưng sẽ giúp bạn giảm thiểu nó một chút cho ví dụ của bạn.

+0

Bạn đã làm cho ngày của tôi. Điều này loại bỏ rất nhiều cruft. (Tâm trí bạn nếu tôi chỉ có thể khiến họ từ bỏ trường cũ ASP.NET và sử dụng Durandal chúng tôi sẽ không làm điều này vô nghĩa cấp thấp ...) –

+1

Để làm điều này toàn ứng dụng, bạn có thể sử dụng 'JsonConvert.DefaultSettings = () => JsonSerializerSettings mới {StringEscapeHandling = StringEscapeHandling.EscapeHtml}; ' – dana

Các vấn đề liên quan