Nó ngăn tiết lộ phản hồi thông qua việc chiếm quyền điều khiển JSON.
Về lý thuyết, nội dung của các phản hồi HTTP được bảo vệ bởi Chính sách nguồn gốc giống nhau: các trang từ một tên miền không thể nhận được bất kỳ mẩu thông tin nào từ các trang trên tên miền khác (trừ khi được cho phép rõ ràng).
Kẻ tấn công có thể yêu cầu các trang trên các tên miền khác thay mặt bạn, ví dụ: bằng cách sử dụng một <script src=...>
hoặc<img>
thẻ thẻ, nhưng nó không thể nhận được bất kỳ thông tin nào về kết quả (tiêu đề, nội dung).
Do đó, nếu bạn truy cập trang của kẻ tấn công, nó không thể đọc email của bạn từ gmail.com.
Ngoại trừ khi sử dụng thẻ script để yêu cầu nội dung JSON, JSON được thực thi dưới dạng Javascript trong môi trường do kẻ tấn công kiểm soát. Nếu kẻ tấn công có thể thay thế hàm tạo Array hoặc Object hoặc một số phương thức khác được sử dụng trong quá trình xây dựng đối tượng, mọi thứ trong JSON sẽ chuyển qua mã của kẻ tấn công và được tiết lộ.
Lưu ý rằng điều này xảy ra tại thời điểm JSON được thực thi dưới dạng Javascript, chứ không phải tại thời điểm nó được phân tích cú pháp.
Có nhiều biện pháp đối phó:
Đảm bảo JSON không bao giờ thực thi
Bằng cách đặt một while(1);
câu lệnh trước dữ liệu JSON, Google đảm bảo rằng dữ liệu JSON không bao giờ được thực thi dưới dạng Javascript.
Chỉ một trang hợp pháp mới có thể lấy toàn bộ nội dung, loại bỏ while(1);
và phân tích phần còn lại dưới dạng JSON.
Những điều như for(;;);
đã được nhìn thấy tại Facebook chẳng hạn, với kết quả tương tự.
Đảm bảo JSON không hợp lệ Javascript
Tương tự, việc thêm các mã thông báo không hợp lệ trước JSON, như &&&START&&&
, đảm bảo rằng nó không bao giờ được thực thi.
Luôn trả lại JSON với một đối tượng ở bên ngoài
Đây là OWASP
cách được khuyến nghị để bảo vệ khỏi việc chiếm quyền điều khiển JSON và là cách ít xâm phạm hơn.
Tương tự như các biện pháp đối phó trước đây, nó đảm bảo rằng JSON không bao giờ được thực thi dưới dạng Javascript.
Một đối tượng JSON hợp lệ, khi không được bao quanh bởi bất kỳ thứ gì, không hợp lệ trong Javascript:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
Tuy nhiên, đây là JSON hợp lệ:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
Vì vậy, hãy đảm bảo bạn luôn trả về một Đối tượng ở mức cao nhất của phản hồi, đảm bảo rằng JSON không phải là Javascript hợp lệ, trong khi vẫn là JSON hợp lệ.
Theo ghi nhận của @hvd trong các bình luận, đối tượng trống {}
là Javascript hợp lệ và việc biết đối tượng trống có thể là thông tin có giá trị.
So sánh các phương pháp trên
Cách OWASP ít xâm phạm hơn, vì nó không cần thay đổi thư viện khách và chuyển JSON hợp lệ. Tuy nhiên, không chắc là các lỗi trình duyệt trong quá khứ hay tương lai có thể đánh bại điều này hay không. Theo ghi nhận của @oriadam, không rõ liệu dữ liệu có thể bị rò rỉ trong lỗi phân tích cú pháp thông qua xử lý lỗi hay không (ví dụ: window.onerror).
Cách của Google yêu cầu thư viện máy khách hỗ trợ thư viện tự động hóa và có thể được coi là an toàn hơn đối với các lỗi trình duyệt.
Cả hai phương pháp đều yêu cầu thay đổi phía máy chủ để tránh các nhà phát triển vô tình gửi JSON dễ bị tổn thương.