0

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

干杯

4

2 回答 2

2

因为在相同的值上再次调用它可以对其进行双重编码。

PHP 文档中的示例为例:

$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;
于 2021-03-23T18:24:34.107 回答
1

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

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

说“只在一个地方做”是记住这两件事的一种方式:如果你在输出时立即做,你就不会意外地双重转义同一个字符串,也不会应用错误的转义对于您将在其他地方使用的字符串。

于 2021-03-23T18:31:07.720 回答