【问题标题】:Properly escape javascript object正确转义 javascript 对象
【发布时间】:2019-05-13 23:36:16
【问题描述】:

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

【问题讨论】:

  • Json decode in wordpress的可能重复
  • 输出应该是什么?
  • @JackBashford 输出应该是{"key":"pairs","are":"fun"}。刚刚逃脱了任何恶意内容。
  • @alt-rock,那么,什么样的恶意内容?如果您只需要有效的 JSON,只需将键值数组或对象(不是字符串)提供给 wp_encode_json(即让它为您构建 json 字符串。)
  • @EPB 可能受到 XSS 影响的内容

标签: javascript php json object


【解决方案1】:

如果您使用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 中生成地图,并将 that 提供给 encode 函数,而不是让你的字符串表示,然后尝试使其安全。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 2010-10-18
    相关资源
    最近更新 更多