javascript - 正确转义 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"}
任何恶意内容。
解决方案
如果您使用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 中生成地图,并将其提供给编码函数,而不是让你的字符串表示,然后尝试使其安全。
推荐阅读
- python - 从 interp2d 中提取值向量
- python - 从熊猫数据框中有条件地选择值
- javascript - 如何在javascript中模拟对输入元素的真正点击
- xml - 左树与右树不兼容
- retrofit2 - 如何使用 Retrofit + RxJava 处理来自并行 Web 请求的错误?
- android - 如何更改 android 软键盘的弹出式键盘的背景颜色?
- php - 查看[ViewPathInController]只在linux环境下找不到
- ampl - 参数已经在ampl中定义
- python - 使用 stencilview 部分显示图像
- javascript - 使用 ethereumjs-wallet 作为浏览器模块