用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网站是如何工作的了吧。