如果您使用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": "<a href="evillinkhere">Hello<\/a><script>evilscript();<\/script>",
"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 中生成地图,并将 that 提供给 encode 函数,而不是让你的字符串表示,然后尝试使其安全。