网址+ htmlentities?怎么想这个?

Sun*_*One 5 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)) . '">';
Run Code Online (Sandbox Code Playgroud)

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

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

我换成"&"通过与放大器; ,我在W3C验证器中验证了我的页面,它出来了.

我仍然担心这个问题.

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

dec*_*eze 8

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

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

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

  • 最终目标只是生成有效的HTML语法.如果您了解所有转义规则,则可以手动编写有效的HTML.如果你只有永不改变的静态内容,你当然可以手工编写而不必每次都逃避它.只有当您拥有无法100%确定的动态内容时,才能保持HTML/URL /任何语法的完整性,您需要通过适当的转义函数来运行它. (2认同)