首页 > 解决方案 > 正确转义 javascript 对象

问题描述

给定一个对象:{"key":"pairs","are":"fun"}它被回显到一个变量中,例如const foo = <?php echo $bar ?>;. 逃离物体的正确方法是什么?我已经尝试过encode_json转义所有{\"key\":\"pairs\",\"are\":\"fun\"}不允许对象渲染的双引号。我也尝试过esc_js将双引号转换为& quot;. 我如何正确地逃避对象并将对象返回到foo?out 应该避免{"key":"pairs","are":"fun"}任何恶意内容。

标签: javascriptphpjsonobject

解决方案


如果您使用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\"}你为它提供了一个已经在 J​​SON 表示法中的字符串。什么wp_json_encode是采用原生 PHP 变量并将它们作为 JSON 转义。它真的是一个非常薄的包装json_encode。我上面的建议实际上是只在 PHP 中生成地图,并将提供给编码函数,而不是让你的字符串表示,然后尝试使其安全。


推荐阅读