文章浏览 复制本页面地址

URL中,查询字符串与HTML实体冲突

IE10+, Safari5.17+, Firefox4.0+,Opera12+, Chrome7+ 已经按新标准实现. 所以就没有这个问题了.

今天遇到一个问题:  在微信端url中有一个 &timestamp 在请求的时候 被转成了 X  , 后来经过查询得知,奶奶的 标准变了.
[code]

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) === ';'){
//如果是 & 或 & 我们就认为是故意要输出 & ,比如是一个调用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'));
}
};
}();

[/code]

标签:
上一篇:
下一篇: