【问题标题】:PHP: is urlencode() a safe way to allow valid UTF-8 strings in the URL?PHP:urlencode() 是允许 URL 中有效 UTF-8 字符串的安全方法吗?
【发布时间】:2010-01-07 23:59:54
【问题描述】:

我有用户提交的标签可以是任何类型的(有效)UTF-8 字符串。我想知道通过urlencode() 运行它们是否可以安全地将它们包含在 URL 中。

换句话说,urlencode() 是否可以安全地用于有效的 UTF-8 字符串? (通过有效我的意思是 id 已经将它们强制编码为 UTF-8)

【问题讨论】:

  • 试试看这里...php.net/manual/en/function.urlencode.php 页面下方有一些讨论,请参阅“dominik dot hofer at gmx dot net”的帖子,它可能会有所帮助
  • Dominik 的问题 (php.net/manual/en/function.urlencode.php#88712) 似乎实际上与生成的字符串对于 javascript/html 不安全这一事实有关。这为 Xeoncross 提出了一个很好的问题:当您的意思是“安全”时,您是指“URL 安全”还是“URL 安全和 HTML 安全”?因为如果您希望 html 安全,除了 urlencode 之外,您还需要使用 htmlentities()。
  • 据我所知,在将 URL 放入 <a href=""> 属性时,您不应该这样做 urlencode。那是浏览器的工作。只需htmlspecialchars
  • 好吧,URL 将作为链接嵌入到页面 HTML 中。对于常规内容:如果您要发送 UTF-8 标头,并且您的内容是通过 htmlspecialchars() 运行的有效 UTF-8 字符串 - 那么您的安全。只有无效的 UTF-8 字符串或没有 UTF-8 标头会造成问题。
  • @Nicolás 我不知道浏览器会自行处理。如果这是真的,那么我将通过 htmlspecialchars 运行我的 URL,就像我的其余代码一样。如果您确定,请将其作为答案提交。

标签: php url utf-8


【解决方案1】:

urlencode 不依赖于特定的字符编码。它只是查看字节,将它们解释为 ASCII 字符并替换任何在 ASCII (0x80–0xFF) 中不允许或在 URL 中以普通格式不允许的字节。

现在回答您的问题:是的,使用urlencode 确实可以对任何字符编码中的任何字符串进行编码,以便安全使用——但仅限于 URL 查询中!因为urlencode 根据application/x-www-form-urlencoded 格式化输入,这与“正常”percent encoding 的空间编码方式不同:在 application/x-www-form-urlencoded 中,空格被替换为+ 而“正常”百分比编码将它们替换为 %20

如果您想“正常”百分比编码,请改用rawurlencode

【讨论】:

    【解决方案2】:

    为了完全安全起见,我会先删除换行符。它们本身并不危险,但它们可以成为利用其他漏洞的垫脚石。

    【讨论】:

      【解决方案3】:

      是的,urlencode() 应该从任何输入字符串中创建一个安全的 URL 字符串。只要该 URL 映射到(folder/file/htaccess),其中就没有时髦的字符。每当清理用户可能会发布一些时髦的东西时,我喜欢这个功能:

      utf8_encode()

      【讨论】:

      • 对不起,utf8_encode() 不是一个安全的函数。它仅用于安全字符串(不是用户输入)。
      • 呃...没有意识到这一点。谢谢!现在我正在使用该功能来清理来自 wordpress 数据库的数据。它是我发现的唯一一个可以删除 wordpress 放入的那些时髦字符(如双空格、带样式的引号)的功能。有没有更好的方法来做到这一点?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-23
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2016-07-18
      • 2011-08-09
      • 2013-08-16
      相关资源
      最近更新 更多