此问题相关信息(我不放在最前面,似乎有些朋友会找不到的样子.)

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为啥这么特殊...我也没想明白...
那么,无论后端同学也好,前端同学也罢,我们可能更改已经定好的字段成本比较高.  所以其实最妥善的办法,应该是这样子: (感谢 @辰光未然 的提醒.)
var fixURL = function (url) {return url.replace(/&/g,'&amp;');
};
//使用fixURL 去替换url中的&.然后再输出给html, 或者跳转链接,又或者弹窗... 当然,前端的同学在js代码中之所以要这样做.主要是受IE的拖累...

  

那么大概,很多HTML 实体都会出问题:
http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references
这个表里, 没有分号结尾的,都是隐患...  也就是下面这106个: (感谢 @kenny 提供的最新的list 地址. 我花了点时间写了个脚本.把需要处理的,都抓了出来.)
我们可以用下面这个脚本来帮忙做检测 :
   var checkURL = function () {var list = [ //106'&Aacute','&aacute','&Acirc','&acirc','&acute','&AElig','&aelig','&Agrave','&agrave','&AMP','&amp','&Aring','&aring','&Atilde','&atilde','&Auml','&auml','&brvbar','&Ccedil','&ccedil','&cedil','&cent','&COPY','&copy','&curren','&deg','&divide','&Eacute','&eacute','&Ecirc','&ecirc','&Egrave','&egrave','&ETH','&eth','&Euml','&euml','&frac12','&frac14','&frac34','&GT','&gt','&Iacute','&iacute','&Icirc','&icirc','&iexcl','&Igrave','&igrave','&iquest','&Iuml','&iuml','&laquo','&LT','&lt','&macr','&micro','&middot','&nbsp','&not','&Ntilde','&ntilde','&Oacute','&oacute','&Ocirc','&ocirc','&Ograve','&ograve','&ordf','&ordm','&Oslash','&oslash','&Otilde','&otilde','&Ouml','&ouml','&para','&plusmn','&pound','&QUOT','&quot','&raquo','&REG','&reg','&sect','&shy','&sup1','&sup2','&sup3','&szlig','&THORN','&thorn','&times','&Uacute','&uacute','&Ucirc','&ucirc','&Ugrave','&ugrave','&uml','&Uuml','&uuml','&Yacute','&yacute','&yen','&yuml'];return function (url) {var l = list;var i = l.length;var matchIndex;var current;var nextchar;var errors = [];for (; i--;){matchIndex = url.indexOf(l[i]);current = l[i];if(matchIndex > -1){if((current === '&amp' || current === '&AMP') && url.charAt(matchIndex + 4) === ';'){//如果是 &amp; 或 &AMP; 我们就认为是故意要输出 & ,比如是一个调用fixURL方法修正过的URL.里面的& 会被我们替换为 amp;//所以,我们要跳过它,去检查后面.continue;}nextchar = url.charAt(matchIndex + current.length);if(!/[a-zA-Z0-9]/.test(nextchar)){//此处我们只要发现任意一个 ,如 &reg后面紧随字符不在 a-z,A-Z,0-9范围内.就算有问题.//这样处理实际和标准的细节以及浏览器实现有细微差异. 但是本着任何浏览器来跑case,都能发现潜在威胁的原则.和实现复杂度的考虑.// 我们姑且粗暴的这样处理了. 似乎还不错.errors.push(current + nextchar);}}}if(errors.length){throw Error('contains : \n' + errors.join('\n'));}};
}();

  

test case 1: 
  var url  = '//www.baidu.com?a=1&amp=2&lt=3&reg=4';           document.onclick = function () { //IE9-好了.证明我们的修正是ok的了.window.open(fixURL(url))};

  

test case 2:
  var url  = '//www.baidu.com?a=1&amp=2&lt=3&reg=4';     try{checkURL(url);}catch(e){alert(e.message)}

转载于:https://www.cnblogs.com/_franky/archive/2012/09/28/2706512.html

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

  1. 如何用js获取浏览器URL中查询字符串的参数

    首先要知道Location这个对象以及这个对象中的一些属性: href:设置或返回完整的url.如本博客首页返回http://www.cnblogs.com/wymninja/ host:设置或返回主 ...

  2. 改写URL的查询字符串QUERY_STRING(转)

    查询字符串是指URL请求中"问号"后面的部分.比如,http://www.nowamagic.net/?foo=bar中粗体部分就是查询字符串,其中变量名是foo,值是bar. 1 ...

  3. 获取请求url的查询字符串

    在两个页面间通过url传参的时候,需要获取传递的查询字符串,例如获取下面url的name对应的值: www.baidu.com/img?name=lili&age=18&school= ...

  4. 采用DAWG方式在大批量字符串中查询字符串

    最近在一个项目中需要针对上百万条(大约在800W条)的字符串进行相关的处理.该字符串是以文本的形式存放在本地硬盘,并且更新频率为20分钟一次. 具体需求: 1.判断某一个字符串是否存在这800W条字符 ...

  5. 【Flask】jinja2根据url中的字符串,决定是否显示某个div

    HTML {% if show_input_box %}<div style="padding:20px 60px 20px 60px"><form id=&qu ...

  6. 取出url中的字符_如何在JavaScript中解析URL:例如主机名,路径名,查询,哈希?...

    统一资源定位符(缩写URL)是对Web资源(网页,图像,文件)的引用.URL指定资源位置和检索资源的机制(http,ftp,mailto). 例如,这是此博客文章的URL: 通常,您需要访问URL的特 ...

  7. URL中关于空格的编码转换成+或转换成%20的问题

    https://www.jianshu.com/p/4a7eb969235d 本人Android开发,某一天,被告知自己程序URL的编码中,空格被转换成了+,导致对方识别不成空格.当然我清楚的记得我是 ...

  8. MySQL SELECT语句查询字符串长度大于、小于或等于指定值

    在MySQL中查询字符串长度使用length关键字,具体用法如下: 先了解一下,Mysql中length().char_length()的区别. length():mysql里面的length()函数 ...

  9. java url json字符串_使用HttpClient将URL中的JSON查询字符串发送到Web服务(Java)

    我有一个我建立的Web服务...我现在要做的是发送一个简单的请求,其中包含一个从Tapestry Web应用程序到该Web服务的json查询字符串.我四处搜索,大多数人都说使用Apache HttpC ...

最新文章

  1. 计算是计算机科学独有的方法,大学计算机基础教学中的计算思维培养.doc
  2. MYSQL查询语句待优化_mysql语句查询优化
  3. 不同编程语言能耗不同?看这27种语言对比!
  4. python时间格式转换time模块
  5. thinkphp v5.0.11漏洞_ThinkPHP(5.1.x ~ 5.1.31 5.0.x ~ 5.0.23)GetShell漏洞
  6. 得到python对象的真实大小
  7. android Handler UI线程后台线程通信
  8. h5 ios 滚动到底部_分享iOS平台使用H5原生滚动的下拉刷新功能v1.0.0 [不推荐]
  9. Notes for Linux Administration Handbook (1) : Booting and Shutting Down
  10. 【GIS】夜光遥感数据时序分析
  11. mac系统添加VSCode到右键菜单
  12. IE11下载文件时,文件扩展名自动由点改为下划线
  13. 常见图片分类及适用场景
  14. python安装requirement.txt
  15. python的pth打开方式_pytorch 加载(.pth)格式的模型实例
  16. 高等数学--微分定理及其应用(四)
  17. [聊天机器人]:开源ChatterBot工作原理
  18. 无线传感网络的发展现状及研究中的关键技术
  19. vivox27计算机功能,vivo x27 怎么连接电脑?
  20. 知乎移动端动态化方案 :Morph

热门文章

  1. linux tar命令压缩_Linux tar命令来压缩和提取文件
  2. java 配对问题_Java中的配对类是什么?
  3. dvm与art的区别_Android运行时– DVM与ART,AOT与JIT
  4. 开课吧:常见的数据可视化分析工具有哪些?
  5. OpenCV(一)Mac下OpenCV的安装和配置
  6. 从0开始构建自己的前端知识体系-JS-事件-键盘事件总结
  7. form表单file,select选择后自动提交
  8. 同一主机,不同域名绑定不同网站(IIS主机头实现方法)
  9. “敏捷”联袂“ALM” 上演市场模范夫妻秀
  10. Java8之list.stream的常见使用例子