2010-11-14 12 views
19

EDIT: W przyszłości, używam non-xhtml definicji typu treści <!html>Osadzanie obiektów JSON w tagach skryptu

tworzę stronę internetową przy użyciu Django, a ja staram się umieścić dowolne dane w json moje strony, które będą używane przez kod javascript po stronie klienta.

Załóżmy, że moim obiektem json jest {"foo": "</script>"}. Jeśli osadzę to bezpośrednio, pierwszy zamyka obiekt Json. (spowoduje to również, że witryna będzie podatna na XSS, ponieważ obiekt ten będzie generowany dynamicznie).

Gdybym użyć funkcji Kopiuj ucieczki Django, uzyskany wynik jest:

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

i przeglądarka nie może interpretować znacznik <script>.

Mam pytanie o to,

  1. jakie znaki czy jestem przypuszczać, aby uciec/nie uciec w tej sytuacji?
  2. Czy istnieje automatyczny sposób wykonania tego w Pythonie/django?
+0

Możesz użyć odwołań encji (<, >) w ciągu

6

Próbowałem backslash ucieczki ukośnik i że wydaje się działać:

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

próbowałeś tego?


Na marginesie, jestem zaskoczony, że osadzony </script> tag w ciąg łamie JavaScript. Początkowo nie mogłem w to uwierzyć, ale testowałem w Chrome i Firefox.

+1

Osadzone włamanie jest trochę oczekiwane (myślałem, że to też było dziwne), ponieważ oznacza to, że parsowanie js musi odbywać się podczas parsowania HTML (parser html musi być świadomy semantyki tekstu javascript), co wydaje mi się bardzo skomplikowane. –

+1

Tak, parsery HTML z reguły nie mówią JavaScript. Zawartość tagów skryptów jest przekazywana tłumaczowi dopiero po przeanalizowaniu kodu HTML, a HTML nie mówi nic o tagach, które nie są tagami, gdy znajdują się pomiędzy znakami cudzysłowu! –

+1

Tak, to jest oczekiwane - zwykłą sztuczką, aby temu zapobiec, jest podzielenie tagu na dwa - '" "' –

0

chciałbym zrobić coś takiego:

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

W tym przypadku w Pythonie, I otworzyły bug w śledzenia błędów. Reguły są jednak naprawdę skomplikowane, ponieważ <!-- i <script> grają razem na dość złe sposoby nawet w przyjętych regułach parsowania html5. BTW, ">" nie jest prawidłową ucieczką JSON, więc lepiej zastąpić ją "\ u003E", więc absolutnie bezpieczne ucieczki powinny być uciec \ u003C i \ u003E ORAZ kilka innych złych znaków wymienionych w błędzie Pythona. ..