此问题相关信息(我不放在最前面,似乎有些朋友会找不到的样子.)
我们来看demo :
<a href="http://www.baidu.com?a=1®=2®_a=3" >悲剧</a>
var fixURL = function (url) { return url.replace(/&/g,'&'); }; //使用fixURL 去替换url中的&.然后再输出给html, 或者跳转链接,又或者弹窗... 当然,前端的同学在js代码中之所以要这样做.主要是受IE的拖累...
var checkURL = function () { var list = [ //106 'Á', 'á', 'Â', 'â', '´', 'Æ', 'æ', 'À', 'à', '&', '&', 'Å', 'å', 'Ã', 'ã', 'Ä', 'ä', '¦', 'Ç', 'ç', '¸', '¢', '©', '©', '¤', '°', '÷', 'É', 'é', 'Ê', 'ê', 'È', 'è', 'Ð', 'ð', 'Ë', 'ë', '½', '¼', '¾', '>', '>', 'Í', 'í', 'Î', 'î', '¡', 'Ì', 'ì', '¿', 'Ï', 'ï', '«', '<', '<', '¯', 'µ', '·', ' ', '¬', 'Ñ', 'ñ', 'Ó', 'ó', 'Ô', 'ô', 'Ò', 'ò', 'ª', 'º', 'Ø', 'ø', 'Õ', 'õ', 'Ö', 'ö', '¶', '±', '£', '"', '"', '»', '®', '®', '§', '­', '¹', '²', '³', 'ß', 'Þ', 'þ', '×', 'Ú', 'ú', 'Û', 'û', 'Ù', 'ù', '¨', 'Ü', 'ü', 'Ý', 'ý', '¥', 'ÿ' ]; 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 === '&' || current === '&') && url.charAt(matchIndex + 4) === ';'){ //如果是 & 或 & 我们就认为是故意要输出 & ,比如是一个调用fixURL方法修正过的URL.里面的& 会被我们替换为 amp; //所以,我们要跳过它,去检查后面. continue; } nextchar = url.charAt(matchIndex + current.length); if(!/[a-zA-Z0-9]/.test(nextchar)){ //此处我们只要发现任意一个 ,如 ®后面紧随字符不在 a-z,A-Z,0-9范围内.就算有问题. //这样处理实际和标准的细节以及浏览器实现有细微差异. 但是本着任何浏览器来跑case,都能发现潜在威胁的原则.和实现复杂度的考虑. // 我们姑且粗暴的这样处理了. 似乎还不错. errors.push(current + nextchar); } } } if(errors.length){ throw Error('contains : \n' + errors.join('\n')); } }; }();
var url = '//www.baidu.com?a=1&=2<=3®=4'; document.onclick = function () { //IE9-好了.证明我们的修正是ok的了. window.open(fixURL(url)) };
var url = '//www.baidu.com?a=1&=2<=3®=4'; try{ checkURL(url); }catch(e){ alert(e.message) }