在某宝的登录界面上,有这么一段代码
S.one(window).on("load", function() { eval(function(p, a, c, k, e, d) { e = function(c) { return c }; if (!''.replace(/^/, String)) { while (c--) { d[c] = k[c] || c } k = [ function(e) { return d[e] } ]; e = function() { return '\\w+' }; c = 1 }; while (c--) { if (k[c]) { p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } } return p }('0 1=5;0 2=4;0 3=1&2;6.9("8").7=3;', 10, 10, 'var|a|b|c|110|10|document|value|gvfdc|getElementById'.split('|'), 0, {}))});
初看之下,很复杂,实际上,分析下来真的很简单,最大的特色就是利用string的replace代码完成了一个把某些文本构造成一个真实有用的语句,然后执行
先来看这句
''.replace(/^/, String)
实际上这句的结果永远为false,大家可以用Firebug在控制台下执行一下看。
这样分析下来, 那下面这句
while (c--) { d[c] = k[c] || c }
在分析这句之前,我们先来看看K的值,它的值为'var|a|b|c|110|10|document|value|gvfdc|getElementById'.split('|')执行得到的,会得到一个10个元素的字符串数组
所以,上面那句语句的含义,我们现在也可以很清楚的知道了,就是分别把它们放到对应下标的词典中去。
最后一个大复杂句,我们再来看一下
while (c--) { if (k[c]) { p = p.replace(new RegExp('\\b' + e(c) + '\\b', 'g'), k[c]) } }
由于上面c=1了,所以这个循环,实际上只执行一次,就是这个关键的replace语句。把所有的单词进行了一个全局替换,替换的内容由k[c]这个值。前面我们会看到k[c]这个东西实际为下面语句:
k = [ function(e) { return d[e] } ];
看到了吗,实际上它返回的就是对应d这个词典中以e(也就是前面正则匹配的单词)为下标对应的项。
到此,整个这么大块语句下来,最后的结果就很清楚了。
你还不知道,那还不快用Firebug去控制台执行看看。
这说不定会成为你写让人看不懂代码的一个突破哦