2010-11-14 29 views
19

EDIT: Để tham khảo trong tương lai, tôi đang sử dụng phi xhtml định nghĩa kiểu nội dung <!html>Nhúng JSON đối tượng trong các thẻ script

tôi là tạo ra một trang web sử dụng Django, và tôi đang cố gắng để nhúng dữ liệu json tùy ý trong các trang của tôi sẽ được sử dụng bởi mã javascript phía máy khách.

Giả sử đối tượng json của tôi là {"foo": "</script>"}. Nếu tôi nhúng trực tiếp điều này,

<script type='text/javascript'>JSON={"foo": "</script>"};</script> 

Lần đầu tiên đóng đối tượng json. (Ngoài ra, nó sẽ làm cho trang web dễ bị XSS, vì đối tượng json này sẽ được tạo động).

Nếu tôi sử dụng chức năng HTML thoát django của, kết quả đầu ra là:

<script type='text/javascript'>JSON={&quot;foo&quot;: &quot;&lt;/script&gt;&quot;};</script> 

và trình duyệt không thể giải thích thẻ <script>.

Các câu hỏi tôi có ở đây là,

  1. Những nhân vật là tôi giả sử để thoát/không thoát khỏi trong tình huống này?
  2. Có cách tự động nào để thực hiện điều này bằng Python/django không?
+0

Bạn có thể sử dụng tham chiếu thực thể (<, >) trong vòng

6

tôi đã cố gắng dấu chéo ngược thoát dấu gạch chéo và điều đó dường như làm việc:

<script type='text/javascript'>JSON={"foo": "<\/script>"};</script> 

Bạn đã thử điều đó không?


Một lưu ý phụ, tôi ngạc nhiên khi nhúng thẻ </script> vào chuỗi ngắt javascript. Không thể tin nó lúc đầu nhưng được thử nghiệm trong Chrome và Firefox.

+1

nhúng vi phạm là kinda mong đợi (tôi nghĩ nó cũng lạ), bởi vì điều đó có nghĩa là phân tích cú pháp js phải được thực hiện dọc theo phân tích cú pháp HTML (html parser phải biết ngữ nghĩa của văn bản javascript), điều này có vẻ rất phức tạp với tôi. –

+1

Đúng, các trình phân tích cú pháp HTML dưới dạng quy tắc không nói JavaScript. Nội dung của các thẻ script chỉ được truyền cho trình thông dịch sau khi HTML được phân tích cú pháp và HTML không nói gì về các thẻ không phải là các thẻ khi chúng nằm giữa các dấu ngoặc kép! –

+1

Vâng, đó là dự kiến ​​- thủ thuật thông thường để ngăn chặn nó là chia nhỏ thẻ thành hai - '" "' –

0

tôi sẽ làm một cái gì đó như thế này:

<script type='text/javascript'>JSON={"foo": "</" + "script>"};</script> 
0

Đối với trường hợp này trong python, tôi đã mở một bug trong bộ theo dõi lỗi. Tuy nhiên, các quy tắc thực sự phức tạp, như <!--<script> chơi cùng nhau theo những cách khá độc ác ngay cả trong các quy tắc phân tích cú pháp html5 đã được thông qua. BTW, ">" không phải là một lối thoát JSON hợp lệ, vì vậy nó sẽ được thay thế bằng "\ u003E", do đó việc thoát hoàn toàn an toàn sẽ là để thoát \ u003C và \ u003E VÀ một vài ký tự ác khác được đề cập trong lỗi trăn. ..

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