网址+ htmlentities?怎么想这个?

时间:2012-10-16 05:44:02

标签: php security url urlencode html-entities

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

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

Php Manual确实提到了htmlentities。但没有进一步的解释:

  

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

我用&amp; amp; 替换了“&amp;”,我在W3C验证器中验证了我的页面,结果没问题。

我仍然担心这个问题。

  1. 有什么理由可以在URL中使用htmlentities吗?
  2. 如果是,这是否适用于所有类型的网址?
  3. 如果是,是出于安全考虑吗?

1 个答案:

答案 0 :(得分:8)

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

  1. 您需要使用urlencode转义放入网址的任意数据,以保留网址中具有特殊含义的字符。
  2. 从第一步获得的任意数据blob在放入HTML时需要进行HTML转义,原因相同。正如您在示例中看到的那样,您的数据中有一个& required 可以通过HTML规则转发到&amp;
  3. 如果您没有在HTML上下文中使用该URL,则无需HTML转义它。 HTML实体在URL中没有位置。与其他任何数据一样,HTML上下文中的URL必须进行HTML转义。