问题描述
我一直在审查大量关于 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。