我在另一个与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验证器中验证了我的页面,结果没问题。
我仍然担心这个问题。
答案 0 :(得分:8)
这与网址中的HTML实体无关。这是关于您将任意数据放入HTML,这意味着您需要HTML转义其中的任何特殊字符。这个数据恰好是一个URL是无关紧要的。
urlencode
转义放入网址的任意数据,以保留网址中具有特殊含义的字符。&
required 可以通过HTML规则转发到&
。如果您没有在HTML上下文中使用该URL,则无需HTML转义它。 HTML实体在URL中没有位置。与其他任何数据一样,HTML上下文中的URL必须进行HTML转义。