PHP - 你的代码中有多个 htmlentities()

PHP - Having more than one htmlentities() in your code

我刚刚在 PHP 中构建了一个 CRUD 应用程序,讲师提醒我们使用htmlentities()为了避免HTML注入,然后他去说htmlentities 不应在您的代码中多次调用,我的问题很简单...为什么?

干杯

因为对同一个值第二次调用它可以对其进行双重编码。

PHP docs为例:

$str = "A 'quote' is <b>bold</b>";

$firstEntity = htmlentities($str);
// Outputs: A 'quote' is &lt;b&gt;bold&lt;/b&gt;

现在,如果我们 运行 再次通过 htmlentities() 它将对第一个 htmlentities() 调用创建的 & 符号进行编码,您将得到一个双重编码的字符串:

$secondEntity = htmlentities($firstEntity);
// Outputs: A 'quote' is &amp;lt;b&amp;gt;bold&amp;lt;/b&amp;gt;

关于转义,有两件重要的事情需要了解:

  • 你不应该 运行 相同的转义函数在相同的值上两次 。例如 htmlentities('1 > 2') 会给你 1 &gt; 2,但是 htmlentities(htmlentities('1 > 2')) 会给你 1 &amp;gt; 2.
  • 你应该只运行转义函数在你发送数据到某处的时候。在 HTML 转义的情况下,您应该在 发送到浏览器 时执行此操作,而不是在保存到数据库或组合不同字符串时执行在你的应用程序的某个地方。如果不这样做,您实际上并不知道使用正确的转义函数,并且很可能最终导致数据损坏,甚至引入新的漏洞。

说“只在一个地方做”是一种记住两者的方式:如果你做它当你输出它时,你不会不小心对同一个字符串进行两次转义,你也不会对你要在其他地方使用的字符串应用错误的转义。