这是一个esc_attr()
和esc_js()
bug还是我做错了什么?
function _action_escape_test() {
$json = json_encode(array(\'test\' => \'<>\\\'"[]"\'));
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\');
最合适的回答,由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>