У меня есть объект stdClass
в PHP, что-то вроде
$o = new stdClass;
$o->foo = $bar
Переменная $bar
содержит недоверенную строку.
Является ли следующий код шаблона PHP достаточной защитой XSS
<script type="text/javascript">
var o = <?php echo json_encode($o); ?>;
</script>
Моя первоначальная инстинктивная реакция заключается в том, что является безопасным, поскольку кодирование объекта в виде JSON гарантирует, что любые потенциальные эксплойты JavaScript будут инертными, если их включить в качестве объектов свойств строки JSON. Примерно так
$o = new stdClass;
$o->foo = "<script type=\"text/javascript\">alert(document.cookie)</script>";
?>
<script type="text/javascript">
var o = <?php echo json_encode($o) ?>;
</script>
В результате получается такой
<script type="text/javascript">
var o = {"foo":"<script type=\"text\/javascript\">alert(document.cookie) <\/script>"};
</script>
Если это известно как небезопасный, существует ли стандартный, зрелый способ сериализации простого объекта stdClass
в строку JSON для использования в части <script/>
HTML-документа.
В ожидании первого быстрого ответа я понимаю, что сработали бы любые HTML-теги или иная XSS-фильтрация каждого элемента объекта JSON, но я ищу краткий способ сделать это. Подобно тому, как это
//$eBar = addslashes($bar);
$sql = sprintf("SELECT * FROM table WHERE foo = '%s'",mysql_real_escape_string($bar));
и это
$sql = $db->select('SELECT * from table where foo = ?', $bar);
(в большинстве случаев) функционально эквивалентны, но последний считается лучшим, более безопасным кодом, поскольку конечному программисту не нужно беспокоиться об экранировании схем.