2010-11-14 2 views
19

EDIT: На будущее, я использую не-Xhtml определение <!html>Вложение JSON объектов в тегах сценария

Я создаю сайт, используя Django типа контента, и я пытаюсь внедрить произвольные данные в формате JSON мои страницы, которые будут использоваться клиентским кодом javascript.

Скажем, мой объект json - {"foo": "</script>"}. Если я вставляю это непосредственно,

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

Первый закрывает объект json. (также это сделает сайт уязвимым для XSS, поскольку этот json-объект будет динамически генерироваться).

Если я использую функцию HTML побега Джанго, полученный результат:

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

и браузер не может интерпретировать <script> тега.

У меня есть вопрос здесь,

  1. Какие символы я я полагаю, чтобы избежать/не избежать в этой ситуации?
  2. Есть ли автоматический способ выполнить это в Python/django?
+0

Вы можете использовать ссылки на объекты (<, >) в пределах

6

Я попытался обратный слэш избежать слэш и что, кажется, работает:

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

вы пробовали это?


На стороне записки, я удивлен, что встроенный </script> тег в строке ломает JavaScript. Сначала не мог поверить, но протестирован в Chrome и Firefox.

+1

embedded ломается как ожидаемый (я думал, что это тоже странно), потому что это означает, что синтаксический анализ js должен выполняться по разбору HTML (синтаксический анализатор html должен знать семантику javascript-текста), что кажется мне очень сложным. –

+1

Да, HTML-парсеры, как правило, не говорят на JavaScript. Содержимое тегов скрипта передается интерпретатору только после того, как HTML разобран, а в HTML ничего не сказано о тегах, которые не являются тегами, когда они находятся между кавычками! –

+1

Да, это ожидается - обычный трюк, чтобы предотвратить его разбить тег на два - '' "' –

0

Я хотел бы сделать что-то вроде этого:

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

Для этого случая в Python, я открыл в багтрекере в bug. Однако правила действительно сложны, так как <!-- и <script> играют довольно злобными способами даже в принятых правилах анализа html5. BTW, ">" не является допустимым escape-кодом JSON, поэтому его лучше заменить на "\ u003E", поэтому абсолютно безопасное экранирование должно состоять в том, чтобы сбежать \ u003C и \ u003E И еще пара злых персонажей, упомянутых в ошибке python. ..

Смежные вопросы