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"`

到目前为止,利用我们已经获得的所有字母,我们可以拼fillfilter 和 find。当然也有一些其他的单词,我们也可以拼写,但这些单词最重要的是,他们都是数组的方法。这意味着他们是数组对象的一部分,可以直接调用数组实例,如:[2,1].sort()

现在,了解JavaScript的另一件重要的特性是一个对象的属性可以通过点符号.或方括号[]访问。上述数组方法是数组对象本身的属性,我们可以使用方括号代替点符号调用这些方法。

所以[2,1]["sort"]() 等效于 [2,1].sort().

我们继续看看,当我们试图使用一个数组的方法会发生什么,我们可以使用到目前为止我们拼写的但没有调用的字母。

[]["fill"]

这会得到function fill() { [native code] },我们可以把这个方法头作为一个字符串再次使用我们的黄金法则:

[]["fill"]+[] === "function fill() { [native code] }"

所以现在我们又得到其他的字符:c,o,v,(,),{,[,],}

随着我们新得到的co,我们现在可以形成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中的六个字符的更多相关文章

  1. JavaScript中Unicode值转字符

    在JavaScript中,将Unicode值转字符的方法: <!DOCTYPE html> <html> <head> <meta charset=" ...

  2. JavaScript中进制和字符编码问题

    1.进制: JavaScript中允许使用字面量的形式声明不同进制的数字: var a = 0b10; // 2 声明一个二进制 var b = 010; // 8 八进制,严格模式下会报错 var ...

  3. 【转】javascript和html中unicode编码和字符转义的详解

    不是十分理解unicode和html转义的情况下,可能会误用,所以下面会对它们再做比较容易理解的解释: 1.html中的转义:在html中如果遇到转义字符(如“ ”),不管你的页面字符编码是utf-8 ...

  4. javascript和html中unicode编码和字符转义的详解

    1.html中的转义:在html中如果遇到转义字符(如“ ”),不管你的页面字符编码是utf-8亦或者是GB2312,都会直接打印成相应的字符:而当遇到(如:“\u8981”[此处的8981是16进制 ...

  5. 六个字符,带你领略JavaScript (js的艺术编写)

    正文从这开始- JavaScript是一门神奇且奇妙的编程语言,我们有时候用它来写一些看似疯狂的代码,但这些代码依然可被执行且运行结果十分有趣.JavaScript 试图帮助我们将一些数据类型转化为我 ...

  6. 前端学习 第六弹: javascript中的函数与闭包

    前端学习 第六弹:  javascript中的函数与闭包 当function里嵌套function时,内部的function可以访问外部function里的变量 function foo(x) {   ...

  7. Javascript 查找字符串中出现最多的字符和出现的次数

    <script type="text/javascript"> //查找字符串中出现最多的字符和出现的次数 var str = 'Thatwheneying its o ...

  8. javascript计算字符串中出现最多的字符和个数

    代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  9. Javascript中使用replace()方法+正则表达式替换掉所有字符

    Js中的replace方法,只能替换掉第一次匹配到的字符,   而我们经常需要替换一个字符串中所有的匹配字符,这时候可以用正则表达式: str.replace(/a/g,"b"); ...

随机推荐

  1. python 文件编码

    错误:UnicodeDecodeError: 'gbk' codec can't decode byte 原因:文件为utf-8编码,系统却用gbk去解码,必然出现错误. 解决方法: with ope ...

  2. 课堂所讲整理:HTML--5JavaScript简介

    一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? 没有什么直接的联系,Java是Sun公司 ...

  3. C++仿函数和typename的用法

    1.仿函数的定义是很简单的,就是一个重载了括号()运算符的类,也被称为函数对象. 主要是用于个性化扩展算法对象.stl中实现了好多算法,每个算法都可以完成日常的大部分工作,设计者还允许你在这些强大的算 ...

  4. android屏蔽软键盘并且显示光标

    if (android.os.Build.VERSION.SDK_INT <= 10) {//4.0以下 danielinbiti editText.setInputType(InputType ...

  5. ASP.NET MVC内置的Filter实现介绍

    有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你创建action过滤器.Action过滤器是自定义的Attributes,用来标记添 ...

  6. Flex 布局教程:实例篇(转)

    你会看到,不管是什么布局,Flex往往都可以几行命令搞定. 我只列出代码,详细的语法解释请查阅<Flex布局教程:语法篇>.我的主要参考资料是Landon Schropp的文章和Solve ...

  7. 【转】HTML - embed 与 object 之争

    在 HTML 里嵌入文本和图片之外的事物,就会用到嵌入标签,而嵌入标签在各浏览器之间的不统一,一直是让开发人员很头痛的问题.一切都要从嵌入 SUN 公司的 Applet Java 小程序开始. 当时, ...

  8. Jquary获取页面控件的值

    一 Jquery获得服务器控件值的方法由于ASP.NET网页运行后,服务器控件会随机生成客户端id,jquery获取时候不太好操作,google了下,总结有以下3种方法: 服务器控件代码:<as ...

  9. FileDataSource java的文件操作

    FileDataSource:(javax.activation.FileDataSource.FileDataSource(File file)) FileDataSource 类实现一个封装文件的 ...

  10. 每日学习心得:CustomValidator验证控件验证用户输入的字符长度、Linq 多字段分组统计、ASP.NET后台弹出confirm对话框,然后点击确定,执行一段代码

    2013-9-15 1.    CustomValidator验证控件验证用户输入的字符长度 在实际的开发中通常会遇到验证用户输入的字符长度的问题,通常的情况下,可以写一个js的脚本或者函数,在ASP ...