【问题标题】:PHP - Having more than one htmlentities() in your codePHP - 在您的代码中有多个 htmlentities()
【发布时间】:2021-06-20 10:52:29
【问题描述】:

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

干杯

【问题讨论】:

  • 不确定他们的推理,但我猜如果你连续多次使用它,你最终会得到多个级别的编码3v4l.org/GkDmb
  • 您仍然可以尝试使用转义函数而不是“htmlentities”:D

标签: php html-entities html-injections


【解决方案1】:

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

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 does have a flag 为了防止双重编码所以回答这个问题,没有理由不在同一个字符串上双重运行这个函数,但它是没有意义的浪费时间和资源。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多