日期:2014-05-16  浏览次数:20674 次

URL 中,查询字符串与HTML实体冲突,可能带来的问题.

?

转自:http://www.cnblogs.com/_franky/archive/2012/09/28/2706512.html
IE10+, Safari5.17+, Firefox4.0+,Opera12+, Chrome7+?已经按新标准实现. 所以就没有这个问题了.
?
参考标准 :?http://www.w3.org/html/ig/zh/wiki/HTML5/tokenization? 新标准明确提到,如果实体后面遇到的不是;且下一个是= 那么就不处理的.就是为了解决这个坑爹的问题的.

?

我们来看demo :

<a href="http://www.baidu.com?a=1&reg=2&reg_a=3" >悲剧</a>

?
部分浏览器(对应上面已经按新标准实现的版本之下的,各个浏览器.)
点上面的链接, 会自动把 ?&reg 转意成? (部分浏览器会自动对转意后的字符进行编码) . ?
?
这个bug.的本质,就是当HTML中出现相关HTML实体(HTML character entity)时.就自动转意处理了. 所以理论上, 用脚本,动态创建的资源则没有这个问题,比如 new Image().src = 'http://www.baidu.com?a=1&reg=2'; 甚至动态创建的iframe.亦如此.
?
IE9- 有两个问题比其他浏览器更严重:
1.?用脚本跳转当前页比如location.href = xxx,或 location.replace(xxx)?.又或者是调用window.open(xxx);如果查询字符串中包含这些html实体, 仍然会触发这个问题...?
2.?,参见标准, 你会知道实体+"其他字符" ? , ? ?"其他字符中",哪些与实体连接在一起,是没有这个问题的. 比如 &rega ?, &reg1 ? ? 其中a, 1 与 &reg 连接就不会有这种问题,从标准角度,甚至是 ?&reg_a 也不应有问题. 但是IE9-又一次打败了我们. ?至于其他特殊字符如 # ~ 等.在各个浏览器中表现各异. 考虑我们在设计字段名时,不大可能出现那些字符.我们也不再纠结其他浏览器在此处实现的差异.
?
?
?
所以,理论上,这个问题应该是后端的同学,在输出html时.更加要注意的问题. ?而前端同学,要注意的则是跳转或弹窗时的url中是否有相关的字段包含一个无分号即为html实体的情况.
?
至于IE为啥这么特殊...我也没想明白...
?