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 相关文章推荐
新手入门常用代码集锦
Jan 11 Javascript
JS提交并解析后台返回的XML的代码
Nov 03 Javascript
JS 面向对象之神奇的prototype
Feb 26 Javascript
5款JavaScript代码压缩工具推荐
Jul 07 Javascript
jQuery绑定事件-多种实现方式总结
May 09 Javascript
javascript RegExp 使用说明
May 21 Javascript
pc加载更多功能和移动端下拉刷新加载数据
Nov 07 Javascript
微信小程序 弹窗自定义实例代码
Mar 08 Javascript
js实现返回顶部效果
Mar 10 Javascript
深入理解node.js之path模块
May 03 Javascript
聊聊那些使用前端Javascript实现的机器学习类库
Sep 18 Javascript
jQuery事件模型默认行为执行顺序及trigger()与 triggerHandler()比较实例分析
Apr 30 jQuery
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 学习提高路线分享
2011/10/23 PHP
php 伪造本地文件包含漏洞的代码
2011/11/03 PHP
PHP警告Cannot use a scalar value as an array的解决方法
2012/01/11 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
PHP和javascript常用正则表达式及用法实例
2014/07/01 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
php中session_id()函数详细介绍,会话id生成过程及session id长度
2015/09/23 PHP
Thinkphp5行为使用方法汇总
2017/12/21 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
php设计模式之状态模式实例分析【星际争霸游戏案例】
2020/03/26 PHP
JavaScript继承方式实例
2010/10/29 Javascript
js中settimeout方法加参数
2014/02/28 Javascript
jQuery仿360导航页图标拖动排序效果代码分享
2015/08/24 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
jQuery解析json格式数据简单实例
2016/01/22 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
vuejs在解析时出现闪烁的原因及防止闪烁的方法
2016/09/19 Javascript
解析JavaScript模仿块级作用域
2016/12/29 Javascript
Move.js入门
2017/02/08 Javascript
javascript数据结构之串的概念与用法分析
2017/04/12 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
JS二分查找算法详解
2017/11/01 Javascript
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python 输出一个两行字符的变量
2009/02/05 Python
python win32 简单操作方法
2017/05/25 Python
使用Python实现从各个子文件夹中复制指定文件的方法
2018/10/25 Python
pycharm双击无响应(打不开问题解决办法)
2020/01/10 Python
Python装饰器用法与知识点小结
2020/03/09 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
Python项目打包成二进制的方法
2020/12/30 Python
HTML5 source标签:媒介元素定义媒介资源
2018/01/29 HTML / CSS
货车司机岗位职责
2014/03/18 职场文书
品牌服务方案
2014/06/03 职场文书
新闻编辑求职信
2014/07/13 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python