簡體   English   中英

正確轉義javascript對象

[英]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": "&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\\"}是您提供了一個已經采用JSON表示法的字符串。 wp_json_encode所做的是獲取本機PHP變量並將其轉義為JSON。 確實,它是圍繞json_encode的相當薄的包裝器。 我上面的建議實際上只是用PHP生成映射,然后將其提供給編碼函數,而不是使用字符串表示形式,然后嘗試使其安全。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM