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 相关文章推荐
对google个性主页的拖拽效果的js的完整注释[转]
Apr 10 Javascript
关于使用 jBox 对话框的提交不能弹出问题解决方法
Nov 07 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
Mar 18 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
Jan 09 Javascript
基于jQuery实现下拉框
Nov 24 Javascript
javascript组合使用构造函数模式和原型模式实例
Jun 04 Javascript
深入探讨前端框架react
Dec 09 Javascript
Node.js安装配置图文教程
May 10 Javascript
JS请求servlet功能示例
Jun 01 Javascript
微信小程序当前时间时段选择器插件使用方法详解
Dec 28 Javascript
JS判断两个数组或对象是否相同的方法示例
Feb 28 Javascript
JavaScript实现简单的计算器
Jan 16 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 分页类(模仿google)-面试题目解答
2009/09/13 PHP
PHP cURL初始化和执行方法入门级代码
2015/05/28 PHP
jquery+php实现导出datatables插件数据到excel的方法
2015/07/06 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
Windows2003下php5.4安装配置教程(IIS)
2016/06/30 PHP
详谈PHP中的密码安全性Password Hashing
2017/02/04 PHP
php和nginx交互实例讲解
2019/09/24 PHP
浅谈JavaScript 标准对象
2016/06/02 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
jQuery实现高级检索功能
2019/05/28 jQuery
vue 兄弟组件的信息传递的方法实例详解
2019/08/30 Javascript
vue element 关闭当前tab 跳转到上一路由操作
2020/07/22 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
如何在 ant 的table中实现图片的渲染操作
2020/10/28 Javascript
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python使用SQLite和Excel操作进行数据分析
2018/01/20 Python
人脸识别经典算法一 特征脸方法(Eigenface)
2018/03/13 Python
python实现时间o(1)的最小栈的实例代码
2018/07/23 Python
Python表达式的优先级详解
2020/02/18 Python
PYQT5 vscode联合操作qtdesigner的方法
2020/03/24 Python
python 怎样进行内存管理
2020/11/10 Python
Django正则URL匹配实现流程解析
2020/11/13 Python
Python3利用scapy局域网实现自动多线程arp扫描功能
2021/01/21 Python
大三自我鉴定范文
2013/10/05 职场文书
申请任职学生会干部自荐书范文
2014/02/13 职场文书
党员一句话承诺大全
2014/03/28 职场文书
篮球比赛策划方案
2014/06/05 职场文书
市场营销策划方案
2014/06/11 职场文书
2015年入党积极分子评语
2015/03/26 职场文书
2015年度保密工作总结
2015/04/24 职场文书
《棉鞋里的阳光》教学反思
2016/02/20 职场文书
MySQL数据库压缩版本安装与配置详细教程
2021/05/21 MySQL