JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )


Posted in Javascript onFebruary 25, 2011
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+ 
($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__ 
[_+~$]+$_[_]+$$](_/_)

注意,上面这段看起来很混乱的代码并不是自动换行,而是三行(当然,你写在同一行也没有错)。编写一个页面运行一下(据说 IE 下不行),你就会发现这段代码的功能等同于
alert(1)
为什么会这样呢?我们来把这段代码拆开来分析。
$=[] // $ 被赋值为一个空数组,所以 !$ 的值为 false.
__ = !$ + $ // 加号会把 !$ 和 $ 都转换成字符串,所以 __ 的值变成了字符串 “false”
_ = -~-~-~$ // 这里有一个 ~ 操作符,它表示 -($+1),所以 -~$ 的值为 1. _ 的值为 3.
由此可以推导:
(__ = !$ + $ )[ _ = -~-~-~$] => (”false”)[_] => (”false”)[3] => “false”[3] = “s” 
({} + $)[_/_] => (”[object Object]“)[_/_] => (”[object Object]“)[1] => “[object Object]“[1] = “o”

接下来再拆 $$=($_=!”+$)[_/_]+$_[+$] :
$_=!”+$ // 注意,!” 中是两个单引号,也就是对一个空字符串做非运算。所以变量 $_ 被赋值为字符串 “true”。
由此可推:
$$=($_=!”+$)[_/_]+$_[+$] => $$ = ( “true”)[1] + “true”[0] => “r” + “t” = “rt”
所以 (__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!”+$)[_/_]+$_[+$]) 就是 “s” + “o” + “rt” ,也就是 “sort”.
所以原来的表达式
($=[$=[]][(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+ 
($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__ 
[_+~$]+$_[_]+$$](_/_)

可以被替换成:
($=[[]]["sort"])()[__[_/_]+__ 
[_+~$]+$_[_]+$$](_/_)

接下来我们看 [__[_/_]+__[_+~$]+$_[_]+$$](_/_) 是什么东西。
前面我们已经得知:
__ = “false”
_ = 3
~$ = -1
$_ = “true”
$$ = “rt”
所以 [__[_/_]+__[_+~$]+$_[_]+$$](_/_) => ["false"[1] + “false”[3-1] + “true”[3] + “rt”](3/3) => ["a" + "l" + "e" + "rt"](1) => ["alert"](1)
所以原来的表达式最终可以被替换成:
($=[[]]["sort"])()["alert"](1)
这段代码是如何执行的呢?我们来逐步分析:
a = [[]] // 创建一个数组
b = a["sort"] // 获取数组的 sort 方法
c = b() // 调用数组的 sort 方法,这里 b() 返回的是 window 对象
d = c["alert"] // 获取 window.alert 方法
d(1) // 调用 window.alert 方法。
所以这堆乱七八遭的表达式最终的执行结果就是 window.alert(1).
更多 请看原文 和 Reddit上的讨论。
原文评论里也有人贴出了一个日本开发者写的小工具,可以把一段 JavaScript 代码编码成各种表情符号,而且可以执行,enjoy it.
BTW, 上面这段代码除了做 XSS 攻击之外作用不大,但是可以从分析这段代码学习一点儿数据类型转换相关的东西,也可以领略到 JavaScript 的灵活。
详细代码解析:
( 
$=[$=[]] // $ = [] 
[ 
(__= !$ + $) // __ = "false" 
[_=-~-~-~$] // _ = 3 
// (__)[3] = "s" 
+ 
({} + $) // ({} + $) = [object Object] 
[_/_] // _/_ = 1 
+ // ([object Object])[1] = "o" 
($$ = // 
($_=!'' + $) // !''+ $ = "true" ; $_ = "true" 
[_/_] // _/_ = 1; 
// $_[1] = "r" 
+ 
$_[+$] // +$ = 0; $_[0] = "t" 
) // $$= "rt" 
] // ["sort"] 
// []["sort"] = [].sort = function sort() { [native code] } 
// $ = []["sort"] 
)() // ($)() = [object Window] 
[ 
__[_/_] // __ = "false"; 
// __[1] = "a" 
+ 
__ [_+~$] //_ = 3; ~$ = -1; _ + ~$ = 2 
// __[2] = "l" 
+ 
$_[_] // $_ = "true" ; _ = 3; 
// $_[3] = "e" 
+ 
$$ // $$ = "rt" 
](_/_); // _ / _ = 1 
// window["alert"](1)

这里需要注意的几点:
1. javascript 里面 $, _ 均可以作为变量名
2. 函数还可以这样调用: 比如 [1,2,4,1,9,1].sort() 可以写成 [1,2,4,1,9,1]["sort"]();
3. ~ 对数字按位取反
4. javascript 中在对不同类型的变量 使用 + 时候的规则
5. 最后一个针对某些native code写的方法,执行会返回 window对象, 比如
var s = [].sort ; t=s(); 则 t 是 window
Javascript 相关文章推荐
IE6浏览器下resize事件被执行了多次解决方法
Dec 11 Javascript
Javascript数组Array基础介绍
Mar 13 Javascript
js实现文字截断功能
Sep 14 Javascript
微信小程序 网络API 上传、下载详解
Nov 09 Javascript
实例解析angularjs的filter过滤器
Dec 14 Javascript
使用js获取伪元素的content实例
Oct 24 Javascript
不得不知的ES6小技巧
Jul 28 Javascript
微信小程序Getuserinfo解决方案图解
Aug 24 Javascript
Vue 3.x+axios跨域方案的踩坑指南
Jul 04 Javascript
element表格翻页第2页从1开始编号(后端从0开始分页)
Dec 10 Javascript
node.js Promise对象的使用方法实例分析
Dec 26 Javascript
JavaScript实现网页tab栏效果制作
Nov 20 Javascript
Javascript中定义方法的另类写法(批量定义js对象的方法)
Feb 25 #Javascript
23个Javascript弹出窗口特效整理
Feb 25 #Javascript
Easy.Ajax 部分源代码 支持文件上传功能, 兼容所有主流浏览器
Feb 24 #Javascript
dojo随手记 gird组件引用
Feb 24 #Javascript
浏览器常用高宽的jquery插件
Feb 24 #Javascript
基于jquery的横向滚动条(滑动条)
Feb 24 #Javascript
基于JQuery的日期联动实现代码
Feb 24 #Javascript
You might like
PHP处理excel cvs表格的方法实例介绍
2013/05/13 PHP
php面向对象中static静态属性与方法的内存位置分析
2015/02/08 PHP
PHP 实现代码复用的一个方法 traits新特性
2015/02/22 PHP
php扩展开发入门demo示例
2019/09/23 PHP
js 判断 enter 事件
2009/02/12 Javascript
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
JS代码优化技巧之通俗版(减少js体积)
2011/12/23 Javascript
javascript window.confirm确认 取消对话框实现代码小结
2012/10/21 Javascript
多个datatable共存造成多个表格的checkbox都被选中
2013/07/11 Javascript
jquery实现更改表格行顺序示例
2014/04/30 Javascript
jQuery设置聚焦并使光标位置在文字最后的实现方法
2016/08/02 Javascript
深入理解ES6 Promise 扩展always方法
2017/09/26 Javascript
3种vue组件的书写形式
2017/11/29 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
vue组件中使用props传递数据的实例详解
2018/04/08 Javascript
node.js使用免费的阿里云ip查询获取ip所在地【推荐】
2018/09/03 Javascript
JavaScript实现shuffle数组洗牌操作示例
2019/01/03 Javascript
vue中进行微博分享的实例讲解
2019/10/14 Javascript
简单讲解Python编程中namedtuple类的用法
2016/06/21 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
Python性能分析工具Profile使用实例
2019/11/19 Python
Python猜数字算法题详解
2020/03/01 Python
Django {{ MEDIA_URL }}无法显示图片的解决方式
2020/04/07 Python
tensorflow/core/platform/cpu_feature_guard.cc:140] Your CPU supports instructions that this T
2020/06/22 Python
python+pygame实现坦克大战小游戏的示例代码(可以自定义子弹速度)
2020/08/11 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
Champion官网:美国冠军运动服装
2017/01/25 全球购物
世界上最大的在线学习和教学市场:Udemy
2017/11/08 全球购物
澳大利亚便宜的家庭购物网站:CrazySales
2018/02/06 全球购物
印度尼西亚电子产品购物网站:Kliknklik
2018/06/05 全球购物
Michael Kors澳大利亚官网:世界知名的奢侈饰品和成衣设计师
2020/02/13 全球购物
大学生在校学习的自我评价
2014/02/18 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
《植树问题》教学反思
2016/03/03 职场文书
七年级作文之冬景
2019/11/07 职场文书
从QQtabBar看css命名规范BEM的详细介绍
2021/08/07 HTML / CSS