Правильно экранировать объект javascript - PullRequest
0 голосов
/ 14 мая 2019

Для данного объекта: {"key":"pairs","are":"fun"}, который отображается в переменной типа const foo = <?php echo $bar ?>;.Как правильно избавиться от объекта?Я попытался encode_json, который экранирует все двойные кавычки {\"key\":\"pairs\",\"are\":\"fun\"}, запрещающие отображение объекта.Я также попытался esc_js, который преобразует двойные кавычки в & quot;.Как правильно экранировать объект и вернуть объект в foo?Выход должен быть {"key":"pairs","are":"fun"} без всякого вредоносного контента.

1 Ответ

1 голос
/ 14 мая 2019

Если вы используете wp_json_encode для создания самой строки JSON, выходные данные, в которых вы назначаете JSON переменной JavaScript в браузере, должны быть достаточно безопасными.Функция wp_json_encode будет экранировать символы, которые в противном случае могли бы позволить кому-то ввести код в точке назначения.

Однако вы также должны учитывать, как будут использоваться ваши значения в парах ключ / значение.Если вы ожидаете целое число, возможно, пропустите значение через intval или если вы ожидаете, что текст, который вы вводите на страницу позже, возможно, пропустите его через esc_html.

Например:

<?php
$map = [
        'key' => 'pairs',
        'are' => '"; I document.write(\'fun trying to break out\')',
        'i_am_expecting_plaintext' => esc_html('<a href="evillinkhere">Hello</a><script>evilscript();</script>'),
        'i_expect_an_integer' => intval("90i"), 
        'some_html_allowed' => wp_kses('<a href="http://nisamerica.com/">here</a><script>dangerous();</script>', ['a' => array('href'=>array())]),
];
?>

<script>const foo = <?php echo wp_json_encode($map, JSON_PRETTY_PRINT); ?>;</script>

Создает следующий вывод:

<script>const foo = {
    "key": "pairs",
    "are": "\"; I document.write('fun trying to break out')",
    "i_am_expecting_plaintext": "&lt;a href=&quot;evillinkhere&quot;&gt;Hello&lt;\/a&gt;&lt;script&gt;evilscript();&lt;\/script&gt;",
    "i_expect_an_integer": 90,
    "some_html_allowed": "<a href=\"http:\/\/nisamerica.com\/\">here<\/a>dangerous();"
};</script>

Приложение:

Причина, по которой wp_json_encode давал вам {\"key\":\"pairs\",\"are\":\"fun\"}, заключается в том, что вы предоставили ей строкуэто уже было в JSON-нотации.wp_json_encode принимает собственные переменные PHP и экранирует их как JSON.Это довольно тонкая оболочка вокруг json_encode на самом деле.Мое предложение выше состоит в том, чтобы просто создать карту в PHP и передать , что , в функцию кодирования вместо создания строкового представления, а затем пытаться сделать его безопасным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...