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吗?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

锋利的jQuery

锋利的jQuery

单东林、张晓菲、魏然 / 人民邮电出版社 / 2012-7-1 / 49.00元

《锋利的jQuery(第2版)》循序渐进地对jQuery的各种函数和方法调用进行了介绍,读者可以系统地掌握jQuery的选择器、DOM操作、事件和动画、AJAX应用、插件、jQuery Mobile、jQuery各个版本变化、jQuery性能优化和技巧等知识点,并结合每个章节后面的案例演示进行练习,达到掌握核心知识点的目的。 为使读者更好地进行开发实践,《锋利的jQuery(第2版)》的第8......一起来看看 《锋利的jQuery》 这本书的介绍吧!

MD5 加密
MD5 加密

MD5 加密工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具