PHP:urlencode()是否是允许URL中包含有效UTF-8字符串的安全方式?

12

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

换句话说,对于有效的UTF-8字符串,urlencode()是否是安全的? (有效指已经强制将它们编码为UTF-8)


尝试在这里查看... http://php.net/manual/zh/function.urlencode.php 页面下部有一些讨论,请查看 "dominik dot hofer at gmx dot net" 的帖子,可能会有所帮助。 - DeveloperChris
Dominik的问题(http://www.php.net/manual/en/function.urlencode.php#88712)似乎实际上是由于生成的字符串不安全于javascript/html。这为Xeoncross提出了一个很好的问题:当你说“安全”时,你是指“URL安全”,还是“URL安全和HTML安全”?因为如果你想要html安全,你需要除urlencode之外还要使用htmlentities()。 - Frank Farmer
3
据我所知,在将URL放入<a href="">属性中时,不应进行urlencode操作。这是浏览器的职责。只需使用htmlspecialchars即可。 - Nicolás
好的,URL将作为链接嵌入页面HTML中。对于常规内容:如果您发送了UTF-8标头,并且您的内容是一个经过 htmlspecialchars() 处理的有效UTF-8字符串 - 那么您就是安全的。只有无效的UTF-8字符串或没有UTF-8标头才会存在问题。 - Xeoncross
@Nicolás 我不知道浏览器会自己处理这个问题。如果是真的,那我就像处理代码中的其他部分一样,将我的URL通过htmlspecialchars进行转义。如果你确定的话,请将其作为答案提交。 - Xeoncross
3个回答

19

urlencode不依赖于特定的字符编码。它只查看字节,将其解释为ASCII字符,并替换任何在ASCII(0x80-0xFF)中不允许或未允许在URL中使用的字节。

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

如果要使用“正常”的百分比编码,请改用rawurlencode


0

是的,urlencode()应该将任何输入字符串转换为安全的URL字符串。只要URL映射到的任何内容(文件夹/文件/htaccess)中没有奇怪的字符即可。每当从用户处对可能发布一些奇怪东西的内容进行净化时,我都喜欢使用此函数:

utf8_encode()


1
抱歉,utf8_encode() 不是一个安全的函数。它只适用于安全字符串(而用户输入不是)。 - Xeoncross
哦...没想到。谢谢!目前我正在使用该函数来清理直接从WordPress数据库中获取的数据。这是我找到的唯一一个可以去除WordPress放入其中的那些奇怪字符(如双空格、样式化引号)的函数。有更好的方法吗? - Code Monkey

0

为了绝对安全起见,我建议先删除换行符。它们本身并不危险,但它们可能成为利用其他漏洞的跳板。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接