问题描述
我一直在审查大量关于 WP 主题和插件安全性的信息,并了解您应该在主题和插件中转义属性和 HTML 值的概念。我已经看到 bloginfo()和 echo get_bloginfo()都使用标准和内部的 esc_html()或 esc_attr()功能。
创世纪和_s,Automattic 的基础主题都逃避了这些价值观,但 WP 自己的 codex 主题标准指南并没有说出任何逃避这些价值观。我已经研究了 WP 代码 (wp-includes/option.php),似乎有一些消息从 get_option()传递的值,但它也看起来像一个插件可以覆盖某些值的过滤器。
这是事实,导致我认为它应该逃脱。任何人都可以启发我吗?
最佳解决方案
我们必须在这里更深入了解您的问题的答案。
所以 bloginfo 是 get_bloginfo 的简单包装。
<?php
function bloginfo( $show='' ) {
echo get_bloginfo( $show, 'display' );
}
注意第二个参数 display 。让我们看看这是做什么的。
<?php
function get_bloginfo( $show = '', $filter = 'raw' ) {
// snip snip, $output is fetched somewhere in here
if ( 'display' == $filter ) {
if ( $url )
$output = apply_filters('bloginfo_url', $output, $show);
else
$output = apply_filters('bloginfo', $output, $show);
}
return $output;
}
如果过滤器设置为 display,则 get_bloginfo 的输出通过过滤器运行。
WPA 使用它自己的钩子系统来做某事,而不是像一个函数中的 esc_html 一样调用。找到发生的地方在 wp-includes/default-filters.php 的地方。在该文件中快速搜索 bloginfo 显示…
<?php
// Format strings for display.
foreach ( array( 'comment_author', 'term_name', 'link_name', 'link_description', 'link_notes', 'bloginfo', 'wp_title', 'widget_title' ) as $filter ) {
add_filter( $filter, 'wptexturize' );
add_filter( $filter, 'convert_chars' );
add_filter( $filter, 'esc_html' );
}
bloginfo 隐藏在 foreach 数组中。您可以看到,bloginfo 的输出使用 esc_html 进行转义。
换句话说,这个:
<?php
bloginfo('name');
相当于:
<?php
echo esc_html(get_bloginfo('name'));
或这个:
<?php
echo get_bloginfo('name', 'display');
所以不,bloginfo 的输出不需要转义。只要第二个参数设置为 display,get_bloginfo 的输出也不会。
但是,请注意,任何人都可以从 bloginfo 中删除 esc_html 过滤器。因此,逃避输出可能更安全。当然,如果您使用 bloginfo 的输出,而不是 HTML 显示 (例如,在图像的 alt 属性中),您应该通过 esc_attr 来运行它。
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。