什么时候需要使用esc_html()?

时间:2019-02-06 作者:cag8f

在渲染之前输出数据时,在何时使用方面的最佳做法是什么esc_html()? 例如,如果我的PHP模板包含以下代码怎么办:

<?php $title = "Contact"; ?>
<h1> <?php echo $title; ?> </h1>
我需要把$标题包装进去吗esc_html()? 如果答案是“否”,你能给我一个我什么时候需要包装的例子吗$title 在里面esc_html()? 假设问题页面上没有用户输入。

This Codex page 似乎在说“是”,应该用esc_html() 任何时候它都包含在HTML元素中。但是this page 似乎表示“否”,应使用esc_html() 只有在变量可能被解释为有害/意外HTML的文本(即动态变量或用户输入的变量)的情况下。

Previous Stack Exchange Questions

我已经看到了以下堆栈交换问题,这些问题提供了一些见解。但没有一个答案是可以接受的,所以我希望在这里得到一个答案。这些问题中的回答表明,我的问题的答案是“否”esc_attr() 在我的特殊情况下不需要。

  • Question 1 - 这里的回答只是说不需要esc_html() 在硬编码URL上
  • Question 2 - 这里的回复表明我需要esc_html(), “…任何时候,如果您不能百分之百确定要输出的是该上下文的有效HTML。”
  • Question 3 - 这表示,“不要费心去转义静态字符串,这是毫无意义的。”

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

虽然这可能是What’s the difference between esc_html, esc_attr, esc_html_e, and so on? 无论如何,我会继续提供答案,因为正如@cag8f所指出的,这个问题没有一个被接受的答案(但我要补充的是,我认为Tom的答案告诉了你需要知道的东西)。

当输出可能在某处发生更改或可能具有某些“不受信任”的值时,需要转义输出。

在您的示例中(下面重复),

<?php $title = "Contact"; ?>
<h1> <?php echo $title; ?> </h1>
你不需要逃避这个。“Contact”已设置,是一个安全值,不会更改。事实上,正如所写的那样,您在浪费空间(和可读性),它实际上应该是硬HTML。

现在,如果你想$title, 这改变了一切。在这种情况下,您需要转义输出,因为您不知道值可能是什么。

例如:

<?php $value = get_user_meta( $user_id, \'some_meta\', true ); ?>
<p>My Value: <?php echo esc_html( $value ); ?></p>
这需要转义,因为您实际上不知道值是什么,因此您不知道输出是否安全。这就是它需要逃离的地方。

还必须了解以下内容:

了解哪些转义函数执行哪些任务。使用不适合数据的值可能会导致无法完全转义该值,或以其他方式破坏该值。有escape functions for different data types, 因此,请使用正确的方法

相关推荐

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