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的eval JSON object问题
Nov 15 Javascript
JavaScript变量声明详解
Nov 27 Javascript
JavaScript框架是什么?怎样才能叫做框架?
Jul 01 Javascript
基于jquery编写的放大镜插件
Mar 23 Javascript
判断是否存在子节点的实现代码
May 18 Javascript
JavaScript暂停和继续定时器的实现方法
Jul 18 Javascript
JavaScript 函数模式详解及示例
Sep 07 Javascript
vue项目中的webpack-dev-sever配置方法
Dec 14 Javascript
使用socket.io制做简易WEB聊天室
Jan 02 Javascript
JavaScript中的this原理及6种常见使用场景详解
Feb 14 Javascript
手把手教您实现react异步加载高阶组件
Apr 07 Javascript
原生JavaScript实现拖动校验功能
Sep 29 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弹出对话框技巧详细解读
2015/09/26 PHP
WIFI万能钥匙密码查询接口实例
2015/09/28 PHP
简单解析PHP程序的运行流程
2016/06/23 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
小议Javascript中的this指针
2010/03/18 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
详解nodejs中的process进程
2017/03/19 NodeJs
JS实现简单获取最近7天和最近3天日期的方法
2018/04/18 Javascript
Vue中对比scoped css和css module的区别
2018/05/17 Javascript
Node4-5静态资源服务器实战以及优化压缩文件实例内容
2019/08/29 Javascript
vue中使用[provide/inject]实现页面reload的方法
2019/09/30 Javascript
关于JS模块化的知识点分享
2019/10/16 Javascript
Vue组件模板及组件互相引用代码实例
2020/03/11 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
2020/04/27 Javascript
[01:28:31]《加油DOTA》真人秀 第五期
2014/09/01 DOTA
matplotlib实现显示伪彩色图像及色度条
2019/12/07 Python
Django多数据库联用实现方法解析
2020/11/12 Python
python matplotlib工具栏源码探析三之添加、删除自定义工具项的案例详解
2021/02/25 Python
matplotlib阶梯图的实现(step())
2021/03/02 Python
澳大利亚制造的羊皮靴:Original UGG Boots
2017/11/13 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
年度考核自我鉴定
2014/03/19 职场文书
缓刑人员思想汇报500字
2014/09/12 职场文书
2014年秘书工作总结
2014/11/25 职场文书
综合测评个人总结
2015/03/03 职场文书
农业项目合作意向书
2015/05/08 职场文书
民事代理词范文
2015/05/25 职场文书
入党积极分子半年考察意见
2015/06/02 职场文书
黑暗中的舞者观后感
2015/06/18 职场文书
关于运动会的宣传稿
2015/07/23 职场文书
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers
JavaScript正则表达式实现注册信息校验功能
2022/05/30 Java/Android