С точки зрения чистого JavaScript, да, вы в безопасности: вывод json_encode
никогда не может содержать ничего, кроме статических значений, которые не будут иметь неожиданной стороны при передаче в eval
.(Хотя при использовании eval
вам обычно приходится окружать строку JSON ()
, чтобы избежать неправильного толкования литерального выражения объекта как блока операторов.)
В сторону: это не обязательно верно для всех JSONкодировщики, потому что есть некоторые символы, которые допустимы для включения raw в строку JSON, которые недопустимы raw в JavaScript.В частности, U + 2028 и U + 2029, которые не могут быть скрыты в строковых литералах JavaScript, поскольку они представляют собой переводы строки.Однако кодировщик PHP кодирует все не-ASCII-символы (например, "\u2028"
), поэтому здесь нет проблем.
С точки зрения JavaScript, встроенного в другой язык (обычно HTML), вы не обязательно в безопасности.Например:
<script type="text/javascript">
var v= <?php echo json_encode($value); ?>;
</script>
В этом примере, что если value
содержит строку с последовательностью символов </script
?Это позволило бы значению преждевременно завершить блок скрипта и таким образом попасть в разметку HTML, где оно могло бы затем внедрить другой вредоносный скрипт.
Чтобы избежать этой проблемы, при включении содержимого JSON в HTML всегда кодируйте <
символ в строковых литералах, например \x3C
или, в JSON-совместимых терминах, \u003C
.Для совместимости со скриптовыми блоками XHTML, отличными от CDATA, выполните также &
.Для совместимости с JS внутри атрибутов обработчика событий также делайте кавычки.
PHP сделает это за вас с правильными опциями json_encode()
:
var v= <?php echo json_encode($value, JSON_HEX_QUOT|JSON_HEX_TAG|JSON_HEX_AMP|JSON_HEX_APOS); ?>;
(Вы можете определитьфункция быстрого доступа для ускорения записи.)