Сведения о вопросе

FUTER

04:05, 5th August, 2020

Теги

HTML   JSON   XSS    

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

Просмотров: 338   Ответов: 3

Безопасно ли вставлять 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>



  Сведения об ответе

P_S_S

01:56, 5th August, 2020

Валидный JSON XSS вызвать не может, а json_encode выдаёт, конечно, валидный. Другое дело, что вы с этим JSONом дальше дальше делать будете — если выводить на страницу, то надо не забывать эскейпить самостоятельно.


  Сведения об ответе

lourence

08:07, 23rd August, 2020

<?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».


  Сведения об ответе

davran

13:13, 6th August, 2020

Смотря чего и куда вставлять. JSON сам по себе это транспорт — если юзер в комментариях вобьет XSS, то он честно будет передан через json заэскейплен и все такое, но как только его, как кусок html, вставят в текст страницы, то тут он и будет кусаться.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться