Esc_attr()损坏json值

时间:2014-09-29 作者:moldcraft

这是一个esc_attr()esc_js() bug还是我做错了什么?

function _action_escape_test() {
    $json = json_encode(array(\'test\' => \'<>\\\'"[]&quot;\'));

    foreach (
        array(
            \'esc_attr\' => esc_attr($json),
            \'esc_js\' => esc_js($json),
            \'htmlspecialchars\' => htmlspecialchars($json, ENT_COMPAT, \'UTF-8\')
        )
        as $func => $esc_value
    ) {
        ?><fieldset class="esc-test">
            <legend><?php echo $func ?>()</legend>
            <textarea data-test-json="<?php echo $esc_value ?>" style="width: 100%"><?php echo htmlspecialchars($esc_value, ENT_COMPAT, \'UTF-8\'); ?></textarea>
        </fieldset><?php
    }

    ?><script type="text/javascript">
        jQuery(function($){
            $(\'.esc-test\').each(function(){
                var $this = $(this);

                try {
                    var json = JSON.parse($this.find(\'textarea\').attr(\'data-test-json\'));

                    $this.css(\'border\', \'1px solid green\');
                } catch (e) {
                    $this.css(\'border\', \'1px solid red\');
                }
            });
        });
    </script><?php
}
add_action(\'admin_notices\', \'_action_escape_test\');
screenshot

1 个回复
最合适的回答,由SO网友:gmazzap 整理而成

通常,当人们想要在javascript中使用字符串时,esc_js 是正确的功能,而不是esc_attr.

问题是esc_js, 根据docs:

转义的文本字符串echoing 在JS中

(我的粗体)。

因此,使用esc_js 您获得了一个可以在js中安全地回显而不是解析的字符串:这不是bug,而是预期的行为。

WordPress中从PHP向js传递数据的规范方法是wp_localize_script 所以你应该考虑改用它。(请注意,函数内部不使用任何esc_* 函数,只需回显json_encode).

作为替代方案,我可以建议您使用filter_var 具有sanitize filters: 我认为这是一种更好的完成任务的方法esc_* WP功能可以。考虑一下esc_* 函数通过过滤器挂钩,所以数据的完整性可能会被外部代码破坏。

尝试:

<?php
$data_safe = filter_var( $json, FILTER_SANITIZE_SPECIAL_CHARS );
$out_safe = filter_var( $json, FILTER_SANITIZE_FULL_SPECIAL_CHARS );
?>
<textarea data-test-json="<?php echo $data_safe; ?>"><?php echo $out_safe; ?></textarea>

结束