php – 可以安全地将经过解码的百分比编码的URI转换成UTF-8吗?

栏目: PHP · 发布时间: 6年前

内容简介:http://stackoverflow.com/questions/7717436/is-it-safe-to-assume-decoded-percent-encoded-uris-turn-into-utf-8

RFC 3986规定,新的URI方案应该先被编码为UTF-8,然后再进行百分比编码.但是,这不适用于以前的URI版本.

假设所有多字节百分号编码的URI在传递到urldecode()之后变为UTF-8编码的字符串是否安全?

例如,如果$_SERVER [‘REQUEST_URI’]的内容被编码为百分比:

/b%C3%BCch/w%C3%B6rterb%C3%BCch

在将此字符串传递给urldecode()后,我应该有一个多字节字符串.但是我怎么知道字符串的编码是什么?在上面的例子中,它是UTF-8,但总是假设是安全的吗?

如果不这样做是不安全的,是否有一种方法(不是mb_detect_encoding)来检测字符串的编码?我已经检查了请求标头,似乎没有任何帮助.

感谢您的所有评论和答案!在我发布问题后,我已经做了一些挖掘工作,并希望把它写在这里作为参考.如果这个答案是错误的,请让我知道.

跳到最后直接得出结论.

JETTY Docs on International Characters and Character Encoding ,

从“URL中的国际字符”部分,我发现了这些

段:

Due to the lack of a standard, different browers took different approaches to the character encoding used. Some use the encoding of the page and some use UTF-8. Some drafts were prepared by various standards bodies suggesting that UTF-8 would become the standard encoding. Older versions of jetty (eg 4.0.x series) used UTF-8 as the default in anticipation of a standard being adopted. As a standard was not forthcoming, jetty-4.1.x reverted to a default encoding of ISO-8859-1.
The W3C organization’s HTML standard now recommends the use of UTF-8: 07001 and accordingly jetty-6 series uses a default of UTF-8.

On the linked HTML 4.0 spec ,确实有一个建议

客户端首先将非ASCII字符编码为UTF-8

百分号编码,所以我们知道这是一个建议

W3C自HTML 4.0起.

该页面上使用的示例是:

<A href="http://foo.org/Håkon">...</A>

虽然后来表示应该使用相同的编码

片段部分,它不说如果它也适用于查询

串.

在浏览器中输入URL

火狐

正如Pekka已经提到的, based on this link Firefox

发送ISO-8859-1编码的URI迟到2007年.阅读链接,

这似乎是Firefox的默认行为3.0.我

不确定这是否也适用于Firefox<3.0在Mac OS X中,

default encoding in Mac is UTF-8 起.

我已经在Windows XP和Firefox 6中测试了Firefox 3.6.13

Windows 7和Mac OS X. Mac版本发送所有内容

UTF-8,所以没什么可担心的.

窗口中的Firefox 3.6.13和6将查询字符串编码为ISO-8859-1

默认情况下,但是当您键入不存在的字符时

ISO-8859-1查询字符串(例如α),Firefox 3

将整个查询字符串的编码切换为UTF-8.我

很确定这在以后的版本中也是一样的.

在我测试的Windows中的Firefox 3.6.13和6中,路径部分

URI始终编码为UTF-8.

如果您在Windows中键入Firefox 3.6 / 6的URL:

http://localhost/test/ü/ä/index.php?chär=ü

查询字符串被编码为ISO-8859-1,但是“路径”部分

被编码为UTF-8:

http://localhost//test/%C3%BC/%C3%A4/index.php?ch%E4r=%FC

还要注意, according to this blog post ,Firefox 3.0

将katanaka字符ア转换为&#12450;之前的百分比编码

它.当我在Firefox 3.6.13中尝试在查询字符串中执行此操作

和路径,katanaka字符正确编码为UTF-8.

歌剧

Mac上的Opera 10.10将URI的查询字符串部分编入

即使Mac OS X的默认编码为ISO-8859-1

UTF-8. “路径”部分被编码为UTF-8,就像Firefox一样.

如果您尝试将希腊字母α输入到其获取的查询字符串中

作为问号发送.

Opera 11.51在Windows XP中显示相同的行为.

苹果浏览器

Mac上的Safari 5.1总是将所有内容发送为UTF-8.

Windows 5.1中的Safari 5.1表现出相同的行为.

Windows上的版本13会将查询字符串和路径编码为

UTF-8. Mac上没有Chrome,但似乎很安全

Chrome总是会像Safari一样发送UTF-8.

IE浏览器

免责声明:我使用IECollection安装多个版本的IE

在一台机器上,所以这可能不是IE的自然行为

(任何人都可以在此确认?).

Windows XP中的IE 6,7和8将URI的“路径”部分编入

UTF-8正确. Umlauts和希腊字母键入查询

字符串不会得到百分比编码.查询字符串键入

到地址栏似乎是发送在ISO-8859-1,希腊字母表

查询字符串中的“α”字符串转换为“a”.

结论

这是短而不完整的,我不能保证

它的正确性,但它似乎是最常见的编码

对于URI是ISO-8859-1和UTF-8(我不知道东亚人

使用它们的编码,对我来说太穷了

并找出).

由于它已经是HTML 4.0的推荐,我猜是这样的

安全地假定URI的“路径”部分始终被编码

UTF-8. Firefox 2.0可能还在,所以你必须检查

编码也是ISO-8859-1.如果不是UTF-8或ISO-8859-1,

很可能这是一个不好的请求.

理论上无法正确检测编码

的字符串(见 herehere ).你可以猜到,但是

你可以得到错误的结果.所以不要依赖编码检测.

安全多字节路由

最安全的方法就是选择一个编码(UTF-8是

最安全的赌注)为您的整个应用程序.那么你必须:

>确保所有的字符串都以UTF-8编码

使用它来构建你的URI.对URI进行适当的百分比编码

之后.

>确保所有的URL编码(GET)表单发送他们的数据

正确的编码.见 this FAQ by Kore Nordmann

有关确保您的表单发送正确的更多信息

编码.

另见 this great answer from bobince .

之后,您不应该在解析URI时遇到任何问题.如果

编码不是在UTF-8,那么这是一个不好的请求,而你

可以响应404或400页.

http://stackoverflow.com/questions/7717436/is-it-safe-to-assume-decoded-percent-encoded-uris-turn-into-utf-8


以上所述就是小编给大家介绍的《php – 可以安全地将经过解码的百分比编码的URI转换成UTF-8吗?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Haskell

Haskell

Simon Thompson / Addison-Wesley / 1999-3-16 / GBP 40.99

The second edition of Haskell: The Craft of Functional Programming is essential reading for beginners to functional programming and newcomers to the Haskell programming language. The emphasis is on th......一起来看看 《Haskell》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具