将静态字符串输出到页面时,是否有必要对输出进行转义?

时间:2019-10-03 作者:cag8f

在我的代码中,我使用\\u e()函数将静态文本回显到页面上:

_e( \'Plugin name not found.\', \'opn_td\' );

这是安全的,还是需要退出此输出?

据我所知(来自WordPress文档herehere), 只有当输出可能是恶意的或不需要的时,才需要进行转义。这里是这样吗?在我看来,这似乎是“否”,但PHP代码嗅探器(在VSCode中)已将其标记为违反WordPress编码标准,表明:

All output should be run through an escaping function (like esc_html_e() or esc_attr_e())...

screenshot here.

我同意“逃避一切”是最安全的选择,也不难实施——在这种情况下,我这样做没有问题。但我更感兴趣的是了解这一行代码实际上会带来多大的安全风险。

我理解esc_html_e() 在输出动态内容时,肯定会在这些情况下使用它。

谢谢。

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

The_e() 函数显示已翻译的字符串;所以1)你实际上是在回应一个动态文本;2)是的,您应该转义已翻译的字符串

相关摘录摘自internationalization security guidePlugin 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() 呼叫。。

    正如你所知,我不是安全专家

  • 相关推荐

    Disable escaping html

    我在用SyntaxHighlighter Evolved 突出显示代码示例。E、 g。[csharp] string s = \"text\"; List<int> numbers = new List<int>(); [/csharp] 当我第一次保存它时,没关系,但编辑wordpress时,文本会更改为[csharp] string s = &quot;text&quot;; List&lt;int&am