这是esc_html_e的正确用法吗?

时间:2018-06-02 作者:coolpasta

<h1 class="page-title"><?php esc_html_e( \'Oops! Something went wrong.\', \'_amnth\' ); ?></h1>
我认为这应该简单地使用__() 函数,因为它是一个静态字符串,不能是动态的,相反,它是HTML。

同时,以下是WooCommerce本身的一些源代码:

<th class="product-name"><?php esc_html_e( \'Product\', \'woocommerce\' ); ?></th>
所以,无论何时将字符串(动态或非动态)输出到HTML,都应该使用esc_html 因此,即使只是输出一个字符串,也应该使用esc_html_e?

Please assume extremely strict escaping rules, where everything needs to be escaped in the right way. (Even so, using esc_html_e seems overkill to the power of 10 ).

3 个回复
SO网友:Mark Kaplun

您应该始终转义输出。句子结束,故事结束。

这些问题就像问你是否可以使用globals和goto。当然,它们是语言的一部分,在某些边缘情况下,它们是生成可工作且可读的代码的唯一方法,但指导原则是,除非您能够证明自己也使用了它们,否则永远不要使用它们。

从理论到实践,这不是真的__ 是静态字符串,就好像它是静态的一样,您根本不会使用它,而是使用文本字符串。更糟糕的是meant 为了提供一种将字符串重写为任何其他字符串的简单方法,您可能不知道该字符串的内容。

在前端,转义可能导致糟糕结果的唯一地方是,有人试图将html标记添加到字符串中作为翻译的一部分,但这种情况极为罕见,尤其是如果您在创建执行输出的代码时考虑到了翻译人员。

在评论中的讨论之后,我觉得也许我应该以不同的方式陈述理由。翻译应该被视为用户输入,因为用户实际上可以编辑它们,或者使用插件来更改它们。如果不是出于安全原因,而不是出于破坏html的原因,所有用户输入都应该是可疑的,因此应该对其进行验证、清理和转义。

使用更传统的用户输入,您有时可以通过执行更严格的验证和卫生措施来避免逃逸,但在翻译方面,您没有机会这样做,而且逃逸几乎是唯一能够防止安全漏洞和破坏html的工具。

SO网友:Tim

你的论点似乎是“产品”永远是“产品”。正如其他人所指出的那样,情况并非如此,因为(1)它可能打印翻译,(2)它可以通过主题中的过滤器或安装的任何插件进行更改。

关于第一点:译者的内容不应该被认为是可信的(在我看来),因此您应该总是(在可能的情况下*)转义任何本地化字符串。即使你个人信任你的翻译人员,他们也可能无辜地输入文本,如果不加处理,会破坏你的网页。

因此,对于您最初的问题“这是esc\\U html\\U e的正确用法吗?”

是的,这对你的两个例子都是绝对正确的

如果你真的担心esc_html 如果过度使用(可能您担心性能),您至少应该使用PHP的本机htmlspecialchars function. 我可能会因为这一建议而被处以私刑,因为从WordPress的角度来看,这不是最佳做法。(您将错过各种其他过滤器和字符集检查)。

这里还有另一个值得讨论的案例:

如果翻译是intended to contain HTML, 喜欢this example 然后,您将经常看到作者打印未替换的字符串。理想情况下,不受信任的HTML应该在打印前进行清理,但即使是WordPress核心也不能做到这一点。

清理HTML比简单地转义HTML带来更大的开销,这可能解释了为什么WordPress也有未转义HTML翻译的示例。Here\'s one in twenty seventeen. 可能是用户在中提供了搜索查询%s 已清理,但翻译尚未清理。打开您最喜爱的PO编辑器,输入如下翻译:

#: search.php:19
msgid "Search Results for: %s"
msgstr "Oh dear <script>alert(\\"HACKED\\")</script>"
瞧。脚本注入搜索结果页面。试试看。这实际上适用于2017年。

我们可以整天争论译者的内容是否值得信任。我认为不是。一个流浪汉,但完全无辜"<" 可能会破坏你的页面。

SO网友:Krzysiek Dróżdż

这取决于。。。几乎在任何情况下。。。

所以,无论何时将字符串(动态或非动态)输出到HTML,都应该使用esc\\u HTML对其进行转义,因此,即使只是输出一个字符串,也应该使用esc\\u HTML\\u e?

是和否。如果您想让HTML显示在那里,那么您不必转义它。但是,如果您想更安全,并且确保不会显示HTML,那么是的,您可以进行转义。

这个“静态字符串”被翻译,所以它不再是静态的。翻译人员可以把任何东西当作翻译。更糟糕的是,你可以使用gettext 过滤以修改它,这样不仅翻译人员,而且任何插件或主题都可以更改该文本。。。

这对我来说并不重要esc_html, 但当你看到esc_attr - 翻译人员很容易将错误的字符放入打印为HTML属性的字符串中,从而破坏您的网站。

结束

相关推荐

Custom metabox translation

我已经创建了一个自定义的帖子类型,并添加了一些自定义的元数据库,现在我想知道我在我的网站上使用了什么样的翻译插件?我对它们都没有经验,所以我不知道谁会支持我的自定义元数据库,谁不会。