探秘JavaScript中的六个字符
JavaScript 是一个奇怪而有趣的语言,我们可以写一些疯狂却仍然有效的代码。它试图帮助我们把事情转换到基于我们如何对待他们的特定类型。
如果我们添加一个字符串,JavaScript会假定我们希望为文本形式表示,所以将它转换为一个字符串。如果我们添加一个正负前缀符号,JavaScript会假定我们希望为数值形式表示,如果可能的话,对我们来说并将字符串转换为一个数字。如果我们添加一个否定符号,JavaScript会将将字符串转换为一个布尔值。
我们可以使用Javascript中[
,]
,(
,)
,!
and +
这六个符号写一些神奇的代码。如果你现在不是在手机,你可以打开浏览器的控制台,你可以将任何代码示例粘贴到控制台,并且代码值为true。
让我们从最基本的开始,要记住一些黄金规则:
!
后面跟的字符会被转换成布尔值
+
后面跟的字符会被转换成数值
[]
后面跟的字符会被转换成字符串
来看下面的例子:
![] === false+[] === 0[]+[] === ""
另一件事你应该知道的是,它可以从字符串使用方括号检索特定的字母,像这样:
"hello"[0] === "h"
还记得可以使多个数字号码通过添加字符串表示在一起,然后把整个表达式转换成一个数字:
+("1" + "1") === 11
我们们继续把一些东西结合在一起得到字母a
![] === false![]+[] === "false"+!![] === 1------------------------(![]+[])[+!![]] === "a" // same as "false"[1]
举一反三!
我们可以通过true
和 false
得到相似的字母a
,e
,f
,l
,r
,s
,t
,u
,那么我们可以从其他地方得到的字母吗?
我们可以通过一些特别的式子如[][[]]
得到undefined
,利用我们上面讲到的黄金法则得到另外的字母d
,i
和 n
。
`[][[]] + [] === "undefined"`
到目前为止,利用我们已经获得的所有字母,我们可以拼fill
, filter
和 find
。当然也有一些其他的单词,我们也可以拼写,但这些单词最重要的是,他们都是数组的方法。这意味着他们是数组对象的一部分,可以直接调用数组实例,如:[2,1].sort()
。
现在,了解JavaScript的另一件重要的特性是一个对象的属性可以通过点符号.
或方括号[]
访问。上述数组方法是数组对象本身的属性,我们可以使用方括号代替点符号调用这些方法。
所以[2,1]["sort"]()
等效于 [2,1].sort()
.
我们继续看看,当我们试图使用一个数组的方法会发生什么,我们可以使用到目前为止我们拼写的但没有调用的字母。
[]["fill"]
这会得到function fill() { [native code] }
,我们可以把这个方法头作为一个字符串再次使用我们的黄金法则:
[]["fill"]+[] === "function fill() { [native code] }"
所以现在我们又得到其他的字符:c
,o
,v
,(
,)
,{
,[
,]
,}
。
随着我们新得到的c
和o
,我们现在可以形成constructor
这个单词。构造函数是一个方法,所有JS对象仅返回自己的构造函数。
到目前为止我们已经处理的对象,我们可以得到它用字符串表示的构造器函数:
true["constructor"] + [] === "function Boolean() { [native code] }" 0["constructor"] + [] === "function Number() { [native code] }" ""["constructor"] + [] === "function String() { [native code] }"[]["constructor"] + [] === "function Array() { [native code] }"({})["constructor"] + [] === "function Object() { [native code] }"
通过这些式子,我们可以将下面的字符加入到我们的库中:B
,N
,S
,A
,O
,m
,b
,g
,y
,j
。
现在我们可以构造一个我们可以使用方括号的函数"toString"`,我们可以这样调用:
(10)["toString"]() === "10"
使用我们的黄金法则,我们已经可以将任何我们想要转换成一个字符串,但是上面这个式子怎么用呢?
好吧,我告诉你,Number
类型的toString
方法有一个称为radix
(“基数”)的秘密的论点。它可以将数值在转换为一个字符串之前先经过基数换算,像这样:
(12)["toString"](10) === "12" // 十进制(12)["toString"](2) === "1100" // 二进制(12)["toString"](8) === "14" // 八进制(12)["toString"](16) === "c" // 十六进制
但是为什么基数只写到16?最大值是36,包括所有的字符0
-9
和 a
-z
,所以现在我们可以得到任何我们想要的字母数字:
(10)["toString"](36) === "a"(35)["toString"](36) === "z"
太棒了!但是其它符号如标点符号和大写字母呢?我们接着深入探索。
这取决于你的JS执行时,它可能会或可能不会访问特定的预定义的对象或数据。如果你在浏览器中运行它,那么你可以访问一些存在的HTML包装器方法。
例如,bold
是一个包装在<>
标签中的字符串方法。
"test"["bold"]() === "<b>test</b>"
通过这个我们得到<>
和/
两个字符。
你可能听说过escape
方法,它主要将字符串转换为一个URI友好的格式,可以让简单的浏览器解释。如果我们传递一个空格字符,我们得到的"%20"。
这里有一个工具可以自动将每个字符自动转换。 工具地址:http://www.jsfuck.com/ 源代码地址:https://raw.githubusercontent.com/aemkei/jsfuck/master/jsfuck.js
为什么这几个字符有用?
它不是Ebay做的一些不好的事情,不久前允许卖家将执行JS在页面中使用只能使用这些字符,但它是一个相当罕见的攻击向量。有些人说混淆,但事实上,有更好的方法混淆。
最后,希望你会喜欢本次探秘之旅。
资源:
https://en.wikipedia.org/wiki/JSFuck
https://esolangs.org/wiki/JSFuck
http://patriciopalladino.com/blog/2012/08/09/non-alphanumeric-javascript.html
https://raw.githubusercontent.com/aemkei/jsfuck/master/jsfuck.js
探秘JavaScript中的六个字符的更多相关文章
- JavaScript中Unicode值转字符
在JavaScript中,将Unicode值转字符的方法: <!DOCTYPE html> <html> <head> <meta charset=" ...
- JavaScript中进制和字符编码问题
1.进制: JavaScript中允许使用字面量的形式声明不同进制的数字: var a = 0b10; // 2 声明一个二进制 var b = 010; // 8 八进制,严格模式下会报错 var ...
- 【转】javascript和html中unicode编码和字符转义的详解
不是十分理解unicode和html转义的情况下,可能会误用,所以下面会对它们再做比较容易理解的解释: 1.html中的转义:在html中如果遇到转义字符(如“ ”),不管你的页面字符编码是utf-8 ...
- javascript和html中unicode编码和字符转义的详解
1.html中的转义:在html中如果遇到转义字符(如“ ”),不管你的页面字符编码是utf-8亦或者是GB2312,都会直接打印成相应的字符:而当遇到(如:“\u8981”[此处的8981是16进制 ...
- 六个字符,带你领略JavaScript (js的艺术编写)
正文从这开始- JavaScript是一门神奇且奇妙的编程语言,我们有时候用它来写一些看似疯狂的代码,但这些代码依然可被执行且运行结果十分有趣.JavaScript 试图帮助我们将一些数据类型转化为我 ...
- 前端学习 第六弹: javascript中的函数与闭包
前端学习 第六弹: javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) { ...
- Javascript 查找字符串中出现最多的字符和出现的次数
<script type="text/javascript"> //查找字符串中出现最多的字符和出现的次数 var str = 'Thatwheneying its o ...
- javascript计算字符串中出现最多的字符和个数
代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...
- Javascript中使用replace()方法+正则表达式替换掉所有字符
Js中的replace方法,只能替换掉第一次匹配到的字符, 而我们经常需要替换一个字符串中所有的匹配字符,这时候可以用正则表达式: str.replace(/a/g,"b"); ...
随机推荐
- c++内置函数---7
原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 内置函数 调用函数时需要一定的时间和空间的开销.一般,函数调用包括5部分: 1.程序先执行函 数调用之前 ...
- alias sample method——运行时间复杂度为O(1)的抽样算法
根据离散离散概率分布抽样是一个常见的问题.这篇文章将介绍运行时间复杂度为O(1)的 alias method 抽样算法思想. 下面举例说明: 比如 a,b,c,d 的概率分别为 0.1,0.2,0.3 ...
- Objective-c——UI基础开发第七天(自定义UITableView)
一.梗概: 1.自定义:headerView,footerVie,Cell等 2.双模型(遵循单一原则,类或模型实现的功能尽量单一) 3.计算文本的方法(针对不同文本内容而设置的宽高等) 4.设置fo ...
- Codeforces Round #146 (Div. 2)
A. Boy or Girl 模拟题意. B. Easy Number Challenge 筛素数,预处理出\(d_i\). 三重循环枚举. C. LCM Challenge 打表找规律. 若\(n\ ...
- scala言语基础学习六
trait的学习 1.将trait作为接口来使用 trait中可以实现一些方法,子类只要extends 了trait就可以直接使用父trait里面的方法 普通继承的话父类和子类之间的field是通过引 ...
- poj3159 最短路(差分约束)
题意:现在需要分糖果,有n个人,现在有些人觉得某个人的糖果数不能比自己多多少个,然后问n最多能在让所有人都满意的情况下比1多多少个. 这道题其实就是差分约束题目,根据题中给出的 a 认为 b 不能比 ...
- 【转】GitHub 中国区前 100 名到底是什么样的人?
原文网址:http://mt.sohu.com/20160407/n443539407.shtml 本文根据Github公开API,抓取了地址显示China的用户,根据粉丝关注做了一个排名,分析前一百 ...
- jquery得到iframe src属性值的方法
这篇文章主要介绍了jquery得到iframe src属性值的方法,很简单,很实用,需要的朋友可以参考下 取得iframe src属性的的值: Html代码 <!DOCTYPE HTML> ...
- Oboe 提升web 用户体验以及性能
Oboe 地址:http://oboejs.com/ 1.安装 bower bower install oboe 2.使用,ajax 模式 oboe('/myapp/things.json') ...
- TKinter的常用组件
python提供了多个图形开发界面的库,几个常用Python GUI库如下: Tkinter: Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.T ...