给出一个对象:{"key":"pairs","are":"fun"}
,该对象被回显到const foo = <?php echo $bar ?>;
之类的变量中。逃脱物体的正确方法是什么?我已经尝试过encode_json
来转义所有双引号{\"key\":\"pairs\",\"are\":\"fun\"}
,从而不允许呈现该对象。我也尝试过esc_js
,它将双引号转换为& quot;
。如何正确转义对象并将对象返回到foo
?应该{"key":"pairs","are":"fun"}
逃出任何恶意内容。
答案 0 :(得分:1)
如果使用class AtomSerializer(serializers.Serializer):
uid = serializers.CharField()
created_at = serializers.DateTimeField()
updated_at = serializers.DateTimeField()
charge = serializers.FloatField()
mass = serializers.FloatField()
def create(self, validated_data):
return Atom(**validated_data)
def update(self, instance, validated_data):
for field, value in validated_data.items():
setattr(instance, field, value)
return instance
本身生成JSON字符串,则在浏览器中将JSON分配给JavaScript变量的输出应该是相当安全的。 CALL sys.ps_truncate_all_tables(FALSE);
函数将转义字符,否则这些字符可能会使某些人在分配点插入代码。
但是,您还必须考虑如何使用键/值对中的值。如果期望整数,则可以通过wp_json_encode
来运行该值,或者期望以后要注入到页面中的纯文本,可以通过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>
的原因是您提供的字符串已经采用JSON表示法。 wp_json_encode
的作用是获取本机PHP变量并将其转为JSON。实际上,它是{\"key\":\"pairs\",\"are\":\"fun\"}
周围非常薄的包装。上面我的建议实际上只是用PHP生成映射,然后将那个馈给encoding函数,而不是先进行字符串表示,然后再尝试使其安全。