Задать вопрос
@Hint

Безопасно ли вставлять JSON в HTML

Безопасно ли вставлять JSON со строками, полученными от пользователя, непосредственно в код страницы через тег script? Нельзя ли при этом с помощью специальных html-последовательностей нарушить JSON, сделав XSS? JSON генерируется PHP-функцией json_encode.

Пример.

$queryData = json_encode(array('query' => isset($_GET['query']) ? $_GET['query'] : '', ...));


Шаблон страницы:
<script type="text/javascript">
<?php echo 'var queryData = ' . $queryData . ';' ?>
</script>
  • Вопрос задан
  • 3875 просмотров
Подписаться 2 Оценить 3 комментария
Пригласить эксперта
Ответы на вопрос 3
Kolyaj
@Kolyaj
Валидный JSON XSS вызвать не может, а json_encode выдаёт, конечно, валидный. Другое дело, что вы с этим JSONом дальше дальше делать будете — если выводить на страницу, то надо не забывать эскейпить самостоятельно.
Ответ написан
Mithgol
@Mithgol
<?php
echo json_encode(array('tzt'=>'\'')); // выдаёт {"tzt":"'"}
echo json_encode(array('tzt'=>'\"')); // выдаёт {"tzt":"\""}
echo json_encode(array('tzt'=>'</script>')); // выдаёт {"tzt":"<\/script>"}
echo json_encode(array('tzt'=>'<\\/script>')); // выдаёт {"tzt":"<\\\/script>"}
echo json_encode(array('tzt'=>"\x0")); // выдаёт {"tzt":"\u0000"}
?>

Кажется, нет способов нарушить JSON. Зато я только что нарушил парсер Хабрахабра: в последних «"»-кавычках (в комментарии) вместо пустого места должно отображаться «\u» и за ним сразу «0000».
Ответ написан
Wott
@Wott
Смотря чего и куда вставлять. JSON сам по себе это транспорт — если юзер в комментариях вобьет XSS, то он честно будет передан через json заэскейплен и все такое, но как только его, как кусок html, вставят в текст страницы, то тут он и будет кусаться.

Опять же если возвращать форму заполненную пользователем, ему же и обратно — да на здоровье пусть хоть что вставляет. А вот в публичный доступ — уже не хорошо.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы