JS的强制类型转换高级玩法,可以做为一种加密手段,或用此写出超高逼格代码的装逼利器!
正文之前,浏览器中按下F12,在控制台输入
(![]+[])[(+!![])+!![]]+(![]+[])[+!![]+!![]+!![]+!![]]+([][![]]+[])[+!![]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([][+[]]+[])[+!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[+!![]]
直接试一下:
<!DOCTYPE html> <html> <head> <title>JS Fuck</title> </head> <body> <script> alert((![]+[])[(+!![])+!![]]+(![]+[])[+!![]+!![]+!![]+!![]]+([][![]]+[])[+!![]]+(!![]+[])[+[]]+([][(![]+[])[+[]]+([][+[]]+[])[+!![]+!![]+!![]+!![]+!![]]+(![]+[])[+!![]+!![]]+(!![]+[])[+[]]+(!![]+[])[+!![]+!![]+!![]]+(!![]+[])[+!![]]]+[])[+!![]+!![]+!![]+!![]+!![]+!![]]+([][![]]+[])[+!![]]); </script> </body> </html>
然后回车看看,是不是很神奇?
是不是在控制台看到了“lenton”? 这是为什么呢?
接下来,我们将在控制台中一步步分析这段神奇的代码。
输入 +[] 得到 0 ,这是JavaScript的类型转换,在 [] 前放一个 +,会把[] 转换为Number类型,值为 0,好了,继续
输入 ![] 得到 false ,同样的,逻辑运算符 ! 会把 [] 转为boolean类型,值 为 false
输入 ![]+[] 得到 "false" , 原因是 ![] 得到 false , false+[] ,boolean类型与[]做加法运算,结果为 "false"字符串
观察发现,"false"字符串中有字符 'l',那么我们就可以把它拿出来了,取字符串的第3个字符: "false"[2]
方法有了,那么索引 2 怎么得到的呢?同开始一样: ![] 是 false ,那么 !![] 是 true , 把 true 转为 Number 类型就是 1,
代码为: +!![] 得到 1,1+1 就是我们要的索引2喽。
有了上面的铺路,我们可以得到最终的结果了: (![]+[])[+!![]+!![]] ,得到了 'l'
其它字母的获得也同理,不再赘述。
下表列出几个简单获取方式供参考研究:
表达式 | 值 |
false | ![] |
true | !![] |
undefined | [][[]] |
NaN | +[![]] |
0 | +[] |
1 | +!+[] |
2 | !+[]+!+[] |
10 | [+!+[]]+[+[]] |
最后上个终级铩器,想要什么有什么:
好好研究下,搞一段加密的代码就可以去装B啦!