6

我在另一个与 urlencode() 相关的论坛上问了一个问题,当一个人出现时轻快地说绝对需要在其之上使用 htmlentities,并且还建议我每次编写 URL 时都应该这样做。“为了有效和安全,他说”。我不明白为什么这可能是一个安全问题。这是他提到的代码:

echo '<a href="index.php?' . htmlentities('page=encode&code='.urlencode($code).'&login='.urlencode($login).'&codeconf=' . urlencode($codeconf)) . '">';

php手册确实提到了htmlentities。但没有进一步的解释:

注意... PHP 支持通过 arg_separator .ini 指令将参数分隔符更改为 W3C 建议的分号。不幸的是,大多数用户代理不会以这种分号分隔的格式发送表单数据。解决此问题的一种更便携的方法是使用 & 而不是 & 作为分隔符。您不需要为此更改 PHP 的 arg_separator。将其保留为 &,但只需使用 htmlentities() 或 htmlspecialchars() 对您的 URL 进行编码。

我用 & 替换了" & " ,我在 W3C 验证器中验证了我的页面,结果正常。

我仍然担心这个 htmlentities 问题。

  1. 为什么应该在 URL 中使用 htmlentities 有什么好的理由吗?
  2. 如果是,这是否适用于所有类型的 URL?
  3. 如果是,是出于安全原因吗?
4

1 回答 1

9

与 URL中的 HTML 实体无关。这是关于您将任意数据放入 HTML 中,这意味着您需要对其中的任何特殊字符进行 HTML 转义。这个数据恰好是一个 URL 是无关紧要的。

  1. 您需要转义任何放入 URL 中的任意数据,urlencode以保留 URL 中具有特殊含义的字符。
  2. 您从第一步获得的任意数据块在放入 HTML 时需要进行 HTML 转义,原因与此相同。正如您在示例中看到的&,您的数据中有一个需要&amp;通过 HTML 规则转义的内容。

如果您没有在 HTML 上下文中使用 URL,则无需对它进行 HTML 转义。HTML 实体在 URL 中没有位置。但是,与任何其他数据一样,HTML 上下文中的 URL 必须是 HTML 转义的。

于 2012-10-16T06:02:19.713 回答