用6个字符写出任意的Javascript代码
Contents
A Javascript journey with only six characters展示了只用(,),+,[,]和!这6个字符能做什么事情。JSFuck是一个网站,把你输入的任何Javascript语句翻译成只用这6个字符表示的形式,比如alert(1)可以用如下的6个字符代码替代,是不是大开眼界:)。
1 | (![]+[])[+!+[]]+(![]+[])[!+[]+!+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]+(!![]+[])[+[]]+(![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]]+[+!+[]]+(!![]+[][(![]+[])[+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]+(!![]+[])[+[]]+(!![]+[])[!+[]+!+[]+!+[]]+(!![]+[])[+!+[]]])[!+[]+!+[]+[+[]]] |
下面简单说一下这个原理。首先,下面的是Javascript的规则:
!开头会被转换成布尔值+开头会被转换成数值[]开头会被转换成字符串
也就是说如下的这些语句都是true。
1 | ![] === false |
这样我们就能做一些有意思的事情了,比如如下的代码:
1 | ![]+[] === "false" |
这样我们其实就能从(,),+,[,]和!这6个字符中得到如下的字符了:true,false,a,e,f,l,r,s,t,u。
我们还能用如下的方式拿到”undefined”。
1 | [][[]] + [] === "undefined" |
另外Number类型的toString方法有一个可以取底数的功能,如下所示,这样我们就能拿到0-9和a-z的所有字符了。如下所示:
1 | (12)["toString"](10) === "12" // base 10 - normal to us |
那么我们如何拼凑一个函数呢?1
[]["fill"]["constructor"] === Function
而Function("alert(1)")能返回给我们如下的函数1
2
3function anonymous() {
alert(1)
}
也就是说如果我写下面的语句,那么就会在浏览器中弹出一个对话框来。1
[]["fill"]["constructor"]("alert(1)")()
而这条语句中的所有字符都能用(,),+,[,]和!这6个字符表示出来,这样大家就理解了那个JSFuck网站是如何工作的了吧。

