核心函数的值应该在输出之前转义吗?

时间:2016-06-27 作者:henrywright

函数的值,如the_permalink() 在输出到浏览器之前是否被转义?例如,我是否需要逃避以下情况?

<a href="<?php the_permalink(); ?>">Link text</a>
我知道我应该转义用户提交的数据等,但假设WordPress已经转义了这类核心功能中的数据,安全吗?

解决方案可能是:

<a href="<?php echo esc_attr( get_permalink() ); ?>">Link text</a>
但是,如果WordPress已经逃离了上游的数据,我为什么要这样做呢?

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

WordPress抄本says:

需要注意的是,大多数WordPress函数都正确地为输出准备了数据,无需再次转义。

例如the_permalink() 已使用以下内容转义输出:

echo esc_url( apply_filters( \'the_permalink\', get_permalink( $post ), $post ) );
所以你不需要自己来这里。但是get_the_permalink() 函数不:

return get_permalink( $post, $leavename );
也不是get_permalink() 功能:

return apply_filters( \'post_link\', $permalink, $post, $leavename );
它们不是特定的显示功能。

WordPress在代码库中使用过滤器,使主题和插件能够调整各种核心功能的输出。以下是一些可能的(边缘情况)示例:

add_filter( \'post_link\', function( $link )
{
    return get_option( \'some_url\' );
}, PHP_INT_MAX );
甚至:

add_filter( \'post_link\', function( $link )
{
    return get_post_meta( 1, \'some_url\', true );
}, PHP_INT_MAX );
所以如果我们显示get_permalink() 直接来说,我们应该用例如。

<a href="<?php echo esc_url( get_permalink() );?>">...</a>
但总的来说,我认为如果我们不知道核心函数是如何处理它的,那么最好避开它的输出,但仅仅检查它不应该太费力。