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 相关文章推荐
javascript XMLHttpRequest对象全面剖析
Apr 24 Javascript
5个javascript的数字格式化函数分享
Dec 07 Javascript
原生javascript实现无间缝滚动示例
Jan 28 Javascript
jquery中$(#form :input)与$(#form input)的区别
Aug 18 Javascript
JavaScript中获取样式的原生方法小结
Oct 08 Javascript
JavaScript动态提示输入框输入字数的方法
Jul 27 Javascript
字符串反转_JavaScript
Apr 28 Javascript
JavaScript中日期函数的相关操作知识
Aug 03 Javascript
javascript 实现动态侧边栏实例详解
Nov 11 Javascript
微信小程序 底部导航栏目开发资料
Dec 05 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
Jun 21 Javascript
angular4 共享服务在多个组件中数据通信的示例
Mar 30 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获取中英混合字符串长度的方法
2014/06/07 PHP
php5.4以下版本json不支持不转义内容中文的解决方法
2015/01/13 PHP
php输出xml属性的方法
2015/03/19 PHP
PHP设计模式之简单投诉页面实例
2016/02/24 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
php分页查询的简单实现代码
2017/03/14 PHP
Laravel 连接(Join)示例
2019/10/16 PHP
Laravel框架Blade模板简介及模板继承用法分析
2019/12/03 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
在HTML代码中使用JavaScript代码的例子
2014/10/16 Javascript
实现非常简单的js双向数据绑定
2015/11/06 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
js运动事件函数详解
2016/10/21 Javascript
JavaScript实现公历转农历功能示例
2017/02/13 Javascript
JS表格组件神器bootstrap table使用指南详解
2017/04/12 Javascript
Javasript设计模式之链式调用详解
2018/04/26 Javascript
最简单的JS实现json转csv的方法
2019/01/10 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
javascript如何实现create方法
2019/11/04 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
vue 验证两次输入的密码是否一致的方法示例
2020/09/29 Javascript
对python中数组的del,remove,pop区别详解
2018/11/07 Python
TensorFlow Saver:保存和读取模型参数.ckpt实例
2020/02/10 Python
解决Opencv+Python cv2.imshow闪退问题
2020/04/24 Python
无需压缩软件,用python帮你操作压缩包
2020/08/17 Python
Magee 1866官网:Donegal粗花呢外套和大衣专家
2019/11/01 全球购物
init进程的作用
2012/04/12 面试题
个人授权委托书
2014/04/03 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
事业单位个人查摆问题及整改措施
2014/10/28 职场文书
分居协议书范本
2014/11/03 职场文书
2014业务员年终工作总结
2014/12/09 职场文书
趣味运动会新闻稿
2015/07/17 职场文书
python3实现无权最短路径的方法
2021/05/12 Python