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 相关文章推荐
通过继承IHttpHandle实现JS插件的组织与管理
Jul 13 Javascript
仅Firefox中链接A无法实现模拟点击以触发其默认行为
Jul 31 Javascript
js判断选择的时间是否大于今天的代码
Aug 20 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
Bootstrap jquery.twbsPagination.js动态页码分页实例代码
Feb 20 Javascript
JS HTML图片显示Canvas 压缩功能
Jul 21 Javascript
jQuery中each循环的跳出和结束实例
Aug 16 jQuery
JS秒杀倒计时功能完整实例【使用jQuery3.1.1】
Sep 03 jQuery
js实现小球在页面规定的区域运动
Jun 16 Javascript
vue+element_ui上传文件,并传递额外参数操作
Dec 05 Vue.js
Vue实现小购物车功能
Dec 21 Vue.js
JavaScript实现筛选数组
Mar 02 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 clearstatcache()函数详解
2010/03/02 PHP
解析PHP汉字转换拼音的类
2013/06/18 PHP
浅析PHP中的字符串编码转换(自动识别原编码)
2013/07/02 PHP
PHP二维数组排序的3种方法和自定义函数分享
2014/04/09 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
php+memcache实现的网站在线人数统计代码
2014/07/04 PHP
php记录搜索引擎爬行记录的实现代码
2018/03/02 PHP
php中目录操作opendir()、readdir()及scandir()用法示例
2019/06/08 PHP
JavaScript延迟加载
2021/03/09 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
如何编写高质量JS代码(续)
2015/02/25 Javascript
JavaScript处理解析JSON数据过程详解
2015/09/11 Javascript
如何利用JS通过身份证号获取当事人的生日、年龄、性别
2016/01/22 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
Vue表单验证插件Vue Validator使用方法详解
2017/04/07 Javascript
详解nodejs微信公众号开发——4.自动回复各种消息
2017/04/11 NodeJs
利用PM2部署node.js项目的方法教程
2017/05/10 Javascript
vue2.0 父组件给子组件传递数据的方法
2018/01/15 Javascript
JavaScript实现通讯录功能
2020/12/27 Javascript
python高手之路python处理excel文件(方法汇总)
2016/01/07 Python
python dict 字典 以及 赋值 引用的一些实例(详解)
2017/01/20 Python
[原创]使用豆瓣提供的国内pypi源
2017/07/02 Python
python 实现对文件夹内的文件排序编号
2018/04/12 Python
python使用writerows写csv文件产生多余空行的处理方法
2019/08/01 Python
Python使用Tkinter实现滚动抽奖器效果
2020/01/06 Python
最小二乘法及其python实现详解
2020/02/24 Python
python 实现rolling和apply函数的向下取值操作
2020/06/08 Python
Python利用matplotlib绘制折线图的新手教程
2020/11/05 Python
The Kooples美国官方网站:为情侣提供的法国当代时尚品牌
2019/01/03 全球购物
利用指针变量实现队列的入队操作
2012/04/07 面试题
什么叫做SQL注入,如何防止
2016/10/04 面试题
会计学个人自荐信模板
2013/12/13 职场文书
我的理想演讲稿
2014/04/30 职场文书
党员转正意见怎么写
2015/06/03 职场文书
小王子读书笔记
2015/06/29 职场文书
《现实主义勇者的王国再建记》第三弹OST全曲试听片段公开
2022/04/04 日漫