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 输入框内容格式验证代码
Feb 11 Javascript
js jquery验证银行卡号信息正则学习
Jan 21 Javascript
js获取控件位置以及不同浏览器中的差别介绍
Aug 08 Javascript
2014 年最热门的21款JavaScript框架推荐
Dec 25 Javascript
纯js代码实现未知宽高的元素在指定元素中垂直水平居中显示
Sep 12 Javascript
JS读写CSS样式的方法汇总
Aug 16 Javascript
node.js学习之交互式解释器REPL详解
Dec 08 Javascript
JS去掉字符串前后空格、阻止表单提交的实现代码
Jun 08 Javascript
AngularJS实现的省市二级联动功能示例【可对选项实现增删】
Oct 26 Javascript
JS实现不用中间变量temp 实现两个变量值得交换方法
Feb 04 Javascript
JS开发常用工具函数(小结)
Jul 04 Javascript
bootstrap-paginator服务器端分页使用方法详解
Feb 13 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
《Pokemon Sword·Shield》系列WEB动画《薄明之翼》第2话声优阵容公开!
2020/03/06 日漫
PHP5中的时间相差8小时的解决办法
2008/03/28 PHP
用PHP调用Oracle存储过程的方法
2008/09/12 PHP
php set_time_limit()函数的使用详解
2013/06/05 PHP
解析zend Framework如何自动加载类
2013/06/28 PHP
php上传图片获取路径及给表单字段赋值的方法
2016/01/23 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
2017/02/04 PHP
phpwind放自动注册方法
2006/12/02 Javascript
msn上的tab功能Firefox对childNodes处理的一个BUG
2008/01/21 Javascript
javascript 实用的文字链提示框效果
2010/06/30 Javascript
NodeJS框架Express的模板视图机制分析
2011/07/19 NodeJs
实现点击列表弹出列表索引的两种方式
2013/03/08 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
基于javascript制作微博发布栏效果
2016/04/04 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
全屏滚动插件fullPage.js使用实例解析
2016/10/21 Javascript
Ajax异步文件上传与NodeJS express服务端处理
2017/04/01 NodeJs
关于在vue-cli中使用微信自动登录和分享的实例
2017/06/22 Javascript
react-router browserHistory刷新页面404问题解决方法
2017/12/29 Javascript
js实现抽奖功能
2020/11/24 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
在python3.64中安装pyinstaller库的方法步骤
2020/06/02 Python
Keras 加载已经训练好的模型进行预测操作
2020/06/17 Python
Python 中Operator模块的使用
2021/01/30 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
英国著名的药妆网站:Escentual
2016/07/29 全球购物
BOSE德国官网:尽探索之力,享音乐之极
2016/12/11 全球购物
照片礼物和装饰:MyPhoto
2019/11/02 全球购物
SNIDEL官网:日本VIVI杂志人气少女第一品牌
2020/03/12 全球购物
测试时代收集的软件测试面试题
2013/09/25 面试题
商务考察邀请函范文
2014/01/21 职场文书
合同协议书格式
2014/04/18 职场文书
关于工作经历的证明书
2014/10/11 职场文书
尊师重教主题班会
2015/08/14 职场文书