[英]Properly escape javascript object
給定一個對象: {"key":"pairs","are":"fun"}
,該對象被回顯到類似const foo = <?php echo $bar ?>;
的變量中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生成映射,然后將其提供給編碼函數,而不是使用字符串表示形式,然后嘗試使其安全。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.