The_e()
函数显示已翻译的字符串;所以1)你实际上是在回应一个动态文本;2)是的,您应该转义已翻译的字符串
相关摘录摘自internationalization security guide 在Plugin Handbook:
转义国际化字符串你不能相信翻译人员只会在本地化中添加良性文本;如果他们愿意,可以添加恶意JavaScript或其他代码为了防止这种情况,重要的是treat internationalized strings like you would any other untrusted input.
如果您正在输出字符串,那么它们应该被转义。
Insecure:
<?php _e( \'The REST API content endpoints were added in WordPress 4.7.\', \'your-text-domain\' ); ?>
Secure:
<?php esc_html_e( \'The REST API content endpoints were added in WordPress 4.7.\', \'your-text-domain\' ); ?>
回应您的评论:我何时可以使用
_e()
而不是
esc_html_e()
因此,根据《国际化安全指南》的摘录,我认为我们应该使用esc_html_e()
并避免使用_e()
除非我们百分之百地确信翻译完全没有恶意代码和特殊字符(除了点这样的基本字符/.
, 催眠素/-
和空间)。
人们可能想使用_e()
因为他/她需要HTML代码(例如。b
, a
, 等)进行翻译(例如。<b>hey</b>
将以视觉方式显示hey
以粗体显示:hey):
// if the translation was \'<b>Enviar</b>\' (in Spanish), then \'Enviar\' would
// visually be in bold
_e( \'Submit\' );
// equivalent to echo __( \'Submit\' );
// but here, the text would remain as-is (\'<b>Enviar</b>\')
esc_html_e( \'Submit\' );
// equivalent to echo esc_html( __( \'Submit\' ) );
但是
_e()
, 一个人应该使用
__()
并具有以下功能
wp_kses_data()
,
wp_kses_post()
或
wp_kses()
允许我们控制允许的HTML标记和属性列表(例如,我们可以允许/不允许
href
,
onclick
, 等等)。尽管这些函数不能保证输出实际上是安全的,但使用它们至少比简单地回显原始HTML要好:
// what if the translation was \'Enviar <script>some bad JS code</script>\' ?
_e( \'Submit\' );
// wp_kses_data() by default disallows/removes <script> and </script> tags.
// sample output: \'Enviar some bad JS code\' - doesn\'t look good.. but better
// than the browser executing the bad JS script.
echo wp_kses_data( __( \'Submit\' ) );
然而,如果可以确保翻译是安全的(例如通过调整翻译),那么使用
_e()
不会有问题&mdash;事实上,它更简单(只需一个函数调用)。。。
资源
How to Internationalize Your Plugin
Internationalization Security
Securing Output » Custom Escaping
_e() 不转义HTML输出。。。e、 g。_e( \'Enter your password to view comments.\' );
这分散了我在写之前版本的答案时的注意力。尽管如此,我不会对这种可能不安全的情况作进一步评论_e()
呼叫。。正如你所知,我不是安全专家