内容简介: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字符ア转换为ア之前的百分比编码
它.当我在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,
很可能这是一个不好的请求.
理论上无法正确检测编码
你可以得到错误的结果.所以不要依赖编码检测.
安全多字节路由
最安全的方法就是选择一个编码(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吗?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- YCProgress自定义百分比进度条
- 如何开发一个百分比饼状图动画
- javascript – 具有百分比宽度的jQuery砖石
- relative 和 absolute 元素的百分比定位
- SQL Server数据库按百分比查询出表中的记录数
- Netty-解码器架构与常用解码器
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。