Cả JSON và XML đều là phương tiện cho giao tiếp ứng dụng khách của máy chủ. Vì vậy, tại sao mối quan tâm an ninh với một và không khác?
Sự khác biệt cơ bản là JSON (JavaScript Object Notation) như tên cho thấy rất gần và thân thiện với JavaScript và do đó thiết kế một số phương thức và chức năng JavaScript, JavaScript xử lý chuỗi JSON như là tách trà và cố gắng diễn giải nó trực tiếp, cung cấp giải pháp cho kẻ tấn công để đánh lừa trình thông dịch JavaScript để chạy JavaScript độc hại được nhúng trong chuỗi gây ra lỗ hổng, trong khi XML phải trải qua giai đoạn phân tích cú pháp để phân tích cú pháp thành đối tượng. 2 chức năng JavaScript như vậy là phương thức và thẻ eval().
Làm cách nào để tạo lỗ hổng bảo mật?
Mặc dù web theo chính sách cùng nguồn gốc, lịch sử đã có những sơ hở tìm thấy để vượt qua nó và các trang web độc hại sử dụng chúng để gửi yêu cầu qua trang web vào trang web người dùng xác thực, phá vỡ mục đích của chính sách cùng nguồn gốc.
Ví dụ: Mặc dù có chính sách cùng nguồn gốc, web đã cho phép một số thẻ như <img> <script>
thực hiện yêu cầu GET gốc.
chúng ta hãy nói rằng bạn đang ở trên một trang web www.authenticatedwebsite.com
, nhưng thu hút để mở một www.malicious.com
trong đó có một thẻ trong html của nó <script src="www.authenticatedwebsite.com/get-user-order-history" />
Attacker từ www.malicious.com
sử dụng kịch bản này thẻ hành vi để truy cập dữ liệu cá nhân của bạn từ www.authenticatedwebsite.com
.
Bây giờ, làm cách nào để một thẻ tập lệnh gọi url src, lưu trữ đáp ứng url cho đối tượng javascript [để thực hiện các thao tác như POST vào máy chủ trang web độc hại]?
Dưới đây là vai trò của JSON và XML chứng minh là an toàn hơn ở đây. Vì JavaScript hiểu JSON khá tốt, một số trình thông dịch JavaScript diễn giải chuỗi JSON thô như một JavaScript hợp lệ và chạy nó.
Điều gì có thể chạy chuỗi JSON có khả năng làm, vì nó vẫn không được gán cho một biến?
Điều này có thể đạt được bằng một bản hack lạ mắt khác. Nếu chuỗi JSON được trả về đại diện cho một mảng. JavaScript sẽ cố gắng chạy hàm tạo của lớp Array. Bây giờ có thể ghi đè lên hàm tạo của mảng trong JavaScript. Bạn có thể làm một cái gì đó như:
Array = function(){ yourObject = this };
này về cơ bản là trọng Javascript mảng xây dựng, chẳng hạn bất cứ khi nào gọi JavaScript constructor, mảng giải thích hiện nay được gán cho yourObject, do đó đem lại độc hại truy cập trang web để dữ liệu cá nhân của bạn.
Bây giờ, cuộc tấn công này có thể được sử dụng với các biến thể của chuỗi JSON, với các lỗ hổng phức tạp hơn.
Mặc dù ở trên đại diện cho một tình huống hợp lệ, trong đó JSON có thể nguy hiểm như một định dạng trả về của các API GET của bạn. Điều này thực sự có thể chỉ trong một số phiên bản của một số trình duyệt, và như tôi biết, tất cả các phiên bản hiện đại của các trình duyệt nổi tiếng đã giảm thiểu nó, nhưng khi cơ sở người dùng của bạn có thể được chia trên các phiên bản của trình duyệt, bạn cần phải cẩn thận với GET API đưa ra thông tin riêng tư theo định dạng JSON khỏa thân.
Một trong những kỹ thuật được sử dụng để vượt qua điều này là thêm một thời gian (đúng) trước chuỗi trả lời JSON của bạn, sẽ không bao giờ cho phép trình thông dịch JavaScript tiếp cận chuỗi thực tế. Nhưng nó tạo ra phân tích chi phí trên phía khách hàng của bạn.
Một rủi ro có thể khác mà JSON có thể gây ra là sử dụng phương thức eval()
trên phía máy khách trình duyệt để phân tích cú pháp JSON. Vì eval()
có khả năng chạy tập lệnh, nếu chuỗi JSON của bạn chứa một số tập lệnh ẩn mà eval()
chạy và thực hiện các hành động nguy hiểm mà tập lệnh tấn công được yêu cầu, có thể chứng minh là vấn đề bảo mật cho hệ thống của bạn.Nhưng như những người khác đã đề cập, cuộc tấn công này có thể dễ dàng ngăn chặn bằng cách bỏ hoàn toàn phương thức eval()
làm trình phân tích cú pháp JSON của bạn ở mọi nơi trong mã máy khách. Lỗ hổng dễ bị tổn thương này rất quan trọng đối với các trang web lưu trữ nội dung do người dùng tạo.
Bạn có thể đăng liên kết tới "ở mọi nơi trong nhiều blog" không? Tôi thấy khó tin điều này ... –
@Tim Pietzcker http://www.subbu.org/blog/2006/08/json-vs-xml thấy điều này nhưng những gì anh ấy đang cố giải thích là tôi không hiểu. Xem điểm cuối cùng. –
Vâng, sau đó bạn đã đọc rằng không có bất an, trừ khi bạn làm điều ngu xuẩn với dữ liệu 'eval()' đến từ một nguồn không tin cậy. –