2015-09-21 11 views
6

Tôi đang sử dụng trình gỡ lỗi JSON Newton. Làm thế nào có thể làm sạch JSON cho XSS (cross scripting)? Làm sạch chuỗi JSON trước khi hủy tuần tự hoặc viết một số loại trình chuyển đổi/khử trùng tùy chỉnh? Nếu vậy - tôi không chắc chắn 100% về cách tốt nhất để tiếp cận điều này.làm sạch JSON cho XSS trước khi deserializing

Dưới đây là ví dụ về JSON có tập lệnh nguy hiểm được tiêm và cần "làm sạch". Tôi muốn có một quản lý này trước khi tôi de-serialize nó. Nhưng chúng ta cần phải giả định tất cả các loại kịch bản XSS, bao gồm cả tập lệnh mã hóa BASE64 vv, do đó, vấn đề phức tạp hơn khi một chuỗi REGEX đơn giản thay thế.

{ "MyVar" : "hello<script>bad script code</script>world" } 

Đây là một bản chụp của deserializer tôi (JSON -> Object):

public T Deserialize<T>(string json) 
{ 
    T obj; 

    var JSON = cleanJSON(json); //OPTION 1 sanitize here 

    var customConverter = new JSONSanitizer();// OPTION 2 create a custom converter 

    obj = JsonConvert.DeserializeObject<T>(json, customConverter); 

    return obj; 
} 

JSON được đăng tải từ một giao diện bên UI 3rd, vì vậy nó khá tiếp xúc, vì thế mà xác nhận server-side. Từ đó, nó được tuần tự hóa thành tất cả các loại đối tượng và thường được lưu trữ trong một DB, sau đó được lấy ra và xuất ra trực tiếp trong giao diện người dùng dựa trên HTML do đó việc tiêm script phải được giảm nhẹ.

+1

Tôi đã cập nhật câu hỏi của mình để giải quyết ý tôi là "dọn dẹp". – MarzSocks

+0

Nó phụ thuộc vào ngữ cảnh. Bạn có thể cung cấp một số chi tiết về cách dữ liệu sẽ được hiển thị không? Nó có chứa dữ liệu URL không? Nó sẽ được đặt thẳng vào HTML? Nó sẽ được truy cập từ javascript chỉ? nó là một thuộc tính HTML? Việc ngăn chặn XSS thực sự phụ thuộc vào ngữ cảnh. – Gray

+1

JSON được đăng từ giao diện giao diện người dùng của bên thứ ba, do đó, nó được tiếp xúc khá & do đó xác thực phía máy chủ. Từ đó nó được serialized vào tất cả các loại đối tượng và thường được lưu trữ trong một DB, sau đó được lấy ra và xuất trực tiếp trong giao diện người dùng dựa trên HTML để thẻ script phải được kiểm soát. Lý tưởng nhất là muốn làm sạch nó trước khi nó đi vào lớp logic của ứng dụng và serializer là nơi để cai trị tất cả chúng. :-) – MarzSocks

Trả lời

3

Ok, tôi sẽ cố gắng để giữ này khá ngắn, bởi vì đây là rất nhiều công việc để viết lên toàn bộ điều. Nhưng, về cơ bản, bạn cần tập trung vào bối cảnh dữ liệu bạn cần để vệ sinh. Từ các nhận xét trên bài đăng gốc, có vẻ như một số giá trị trong JSON sẽ được sử dụng dưới dạng HTML sẽ được hiển thị và HTML này đến từ một nguồn không đáng tin cậy. Bước đầu tiên là trích xuất bất kỳ giá trị JSON nào cần được khử trùng dưới dạng HTML và cho từng đối tượng bạn cần để chạy chúng thông qua trình phân tích cú pháp HTML và loại bỏ mọi thứ không nằm trong danh sách cho phép. Đừng quên rằng bạn cũng sẽ cần một danh sách trắng cho các thuộc tính.

HTML Agility Pack là nơi bắt đầu tốt để phân tích cú pháp HTML trong C#. Làm thế nào để làm điều này một phần là một câu hỏi riêng biệt trong quan điểm của tôi - và có lẽ là một bản sao của câu hỏi được liên kết.

Sự lo lắng của bạn về chuỗi base64 có vẻ hơi nhấn mạnh trong quan điểm của tôi. Nó không giống như bạn có thể chỉ cần đặt aW5zZXJ0IGg0eCBoZXJl vào một tài liệu HTML và trình duyệt sẽ hiển thị nó. Nó có thể bị lạm dụng thông qua javascript (mà danh sách trắng của bạn sẽ ngăn chặn) và, ở một mức độ nào đó, thông qua các url(nhưng điều này không phải là xấu, vì javascript sẽ chạy trong ngữ cảnh của trang dữ liệu. Không tốt, nhưng bạn aren ' t tự động gobbling lên cookie với điều này). Nếu bạn phải cho phép a thẻ, một phần của quá trình cần phải xác thực rằng URL là http (s) (hoặc bất kỳ lược đồ nào bạn muốn cho phép).Lý tưởng nhất là bạn sẽ tránh tình huống khó chịu này, và thay vào đó hãy sử dụng một cái gì đó như markdown - sau đó bạn có thể chỉ cần thoát khỏi chuỗi HTML, nhưng điều này không phải lúc nào cũng có thể kiểm soát được. Tuy nhiên, bạn vẫn phải thực hiện một số xác thực URL.

+1

Tôi đã sử dụng tuyến đường này. Đã sử dụng Gói nhanh nhẹn HTML và các giá trị chuỗi được khử trùng trong quá trình chuyển đổi sang JSON. – MarzSocks

+1

Không chắc chắn nếu bạn đang nói rằng bạn khử trùng chúng TRƯỚC KHI lưu trữ chúng, nhưng nếu bạn đang có, bạn có thể muốn ít nhất lưu trữ bản gốc chỉ trong trường hợp có một lỗi và bạn bị hỏng một số dữ liệu. Nếu đó là của bên thứ ba và bạn không lưu trữ nó ở tất cả, thì đó là tốt một trong hai cách. Vui mừng vì nó hữu ích. – Gray

2

Thú vị !! Cam ơn vi đa hỏi. chúng tôi thường sử dụng html.urlencode dưới dạng biểu mẫu web. Tôi có một api chạy trên web doanh nghiệp có xác nhận như thế này. Chúng tôi đã tạo một regex tùy chỉnh để xác thực. Vui lòng xem tại đây MSDN link.

Đây là mô hình mẫu được tạo ra để phân tích các yêu cầu đặt tên KeyValue (nói)

public class KeyValue 
{ 
    public string Key { get; set; } 
} 

Bước 1: Đang cố gắng với một regex tùy chỉnh

var json = @"[{ 'MyVar' : 'hello<script>bad script code</script>world' }]"; 

     JArray readArray = JArray.Parse(json); 
     IList<KeyValue> blogPost = readArray.Select(p => new KeyValue { Key = (string)p["MyVar"] }).ToList(); 

     if (!Regex.IsMatch(blogPost.ToString(), 
      @"^[\p{L}\p{Zs}\p{Lu}\p{Ll}\']{1,40}$")) 
      Console.WriteLine("InValid"); 
      //   ^means start looking at this position. 
      //   \p{ ..} matches any character in the named character class specified by {..}. 
      //   {L} performs a left-to-right match. 
      //   {Lu} performs a match of uppercase. 
      //   {Ll} performs a match of lowercase. 
      //   {Zs} matches separator and space. 
      //   'matches apostrophe. 
      //   {1,40} specifies the number of characters: no less than 1 and no more than 40. 
      //   $ means stop looking at this position. 

Bước 2: Sử dụng HttpUtility .UrlEncode - this newtonsoft website link đề xuất triển khai bên dưới.

string json = @"[{ 'MyVar' : 'hello<script>bad script code</script>world' }]"; 

     JArray readArray = JArray.Parse(json); 
     IList<KeyValue> blogPost = readArray.Select(p => new KeyValue {Key =HttpUtility.UrlEncode((string)p["MyVar"])}).ToList(); 
Các vấn đề liên quan