探秘 JavaScript 中的六個字符

譯者:小青年
鏈接:http://www.zcfy.cc/article/1370
原文:http://jazcash.com/a-javascript-journey-with-only-six-characters/

JavaScript 是一個奇怪而有趣的語言,我們可以寫一些瘋狂卻仍然有效的代碼。它試圖幫助我們把事情轉(zhuǎn)換到基于我們?nèi)绾螌Υ麄兊奶囟愋汀?/p>

如果我們添加一個字符串州既,JavaScript 會假定我們希望為文本形式表示抱完,所以將它轉(zhuǎn)換為一個字符串。如果我們添加一個正負前綴符號剥啤,JavaScript 會假定我們希望為數(shù)值形式表示搞动。如果可能的話,對我們來說并將字符串轉(zhuǎn)換為一個數(shù)字午笛。如果我們添加一個否定符號,JavaScript 會將將字符串轉(zhuǎn)換為一個布爾值。

我們可以使用 Javascript 中[,],(,),!+這六個符號寫一些神奇的代碼。如果你現(xiàn)在不是在手機倒戏,你可以打開瀏覽器的控制臺,你可以將任何代碼示例粘貼到控制臺癌佩,并且代碼值為 true。

讓我們從最基本的開始便锨,要記住一些黃金規(guī)則:

  • !后面跟的字符會被轉(zhuǎn)換成布爾值
  • +后面跟的字符會被轉(zhuǎn)換成數(shù)值
  • []后面跟的字符會被轉(zhuǎn)換成字符串

來看下面的例子:

![] === false
+[] === 0
[]+[] === "" 

另一件事你應(yīng)該知道的是驼卖,它可以從字符串使用方括號檢索特定的字母,像這樣:

"hello"[0] === "h"

還記得可以使多個數(shù)字號碼通過添加字符串表示在一起鸿秆,然后把整個表達式轉(zhuǎn)換成一個數(shù)字:

+("1" + "1") === 11 

我們們繼續(xù)把一些東西結(jié)合在一起得到字母a

![] === false
![]+[] === "false"
+!![] === 1
------------------------
(![]+[])[+!![]] === "a"  // same as "false"[1] 

舉一反三酌畜!

我們可以通過truefalse得到相似的字母a,e,f,l,r,s,t,u,那么我們可以從其他地方得到的字母嗎卿叽?

我們可以通過一些特別的式子如[][[]]得到undefined桥胞,利用我們上面講到的黃金法則得到另外的字母d,in

`[][[]] + [] === "undefined"` 

到目前為止考婴,利用我們已經(jīng)獲得的所有字母贩虾,我們可以拼fill, filterfind。當然也有一些其他的單詞沥阱,我們也可以拼寫缎罢,但這些單詞最重要的是,他們都是數(shù)組的方法。這意味著他們是數(shù)組對象的一部分考杉,可以直接調(diào)用數(shù)組實例策精,如:[2,1].sort()

現(xiàn)在崇棠,了解 JavaScript 的另一件重要的特性是一個對象的屬性可以通過點符號.或方括號[]訪問咽袜。上述數(shù)組方法是數(shù)組對象本身的屬性,我們可以使用方括號代替點符號調(diào)用這些方法枕稀。

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

我們繼續(xù)看看询刹,當我們試圖使用一個數(shù)組的方法會發(fā)生什么,我們可以使用到目前為止我們拼寫的但沒有調(diào)用的字母萎坷。

[]["fill"]

這會得到function fill() { [native code] }凹联,我們可以把這個方法頭作為一個字符串,再次使用我們的黃金法則:

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

所以哆档,現(xiàn)在我們又得到其他的字符:c,o,v,(,),{,[,],}蔽挠。

隨著我們新得到的co,我們現(xiàn)在可以形成constructor這個單詞虐呻。構(gòu)造函數(shù)是一個方法象泵,所有 JS 對象僅返回自己的構(gòu)造函數(shù)。

到目前為止我們已經(jīng)處理的對象斟叼,我們可以得到它用字符串表示的構(gòu)造器函數(shù):

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

現(xiàn)在我們可以構(gòu)造一個我們可以使用方括號的函數(shù)"toString",我們可以這樣調(diào)用:

(10)["toString"]() === "10"

使用我們的黃金法則朗涩,我們已經(jīng)可以將任何我們想要轉(zhuǎn)換成一個字符串忽孽,但是上面這個式子怎么用呢?

好吧谢床,我告訴你兄一,Number類型的toString方法有一個稱為radix(“基數(shù)”)的秘密的論點。它可以將數(shù)值在轉(zhuǎn)換為一個字符串之前先經(jīng)過基數(shù)換算识腿,像這樣:

(12)["toString"](10) === "12"  // 十進制
(12)["toString"](2) === "1100" // 二進制
(12)["toString"](8) === "14"   // 八進制
(12)["toString"](16) === "c"   // 十六進制 

但是為什么基數(shù)只寫到 16出革?最大值是 36,包括所有的字符0-9a-z渡讼,所以現(xiàn)在我們可以得到任何我們想要的字母數(shù)字:

(10)["toString"](36) === "a"
(35)["toString"](36) === "z" 

太棒了骂束!但是其它符號如標點符號和大寫字母呢?我們接著深入探索成箫。

這取決于你的 JS 執(zhí)行時展箱,它可能會,或可能不會訪問特定的預(yù)定義的對象或數(shù)據(jù)蹬昌。如果你在瀏覽器中運行它混驰,那么你可以訪問一些存在的HTML包裝器方法

例如皂贩,bold是一個包裝在<>標簽中的字符串方法栖榨。

"test"["bold"]() === "<b>test</b>" 

通過這個我們得到<>/兩個字符。

你可能聽說過escape方法明刷,它主要將字符串轉(zhuǎn)換為一個 URI 友好的格式治泥,可以讓簡單的瀏覽器解釋。如果我們傳遞一個空格字符遮精,我們得到的"%20"居夹。

這里有一個工具可以自動將每個字符自動轉(zhuǎn)換。

工具地址:http://www.jsfuck.com/
源代碼地址:https://raw.githubusercontent.com/aemkei/jsfuck/master/jsfuck.js

為什么這幾個字符有用本冲?

它不是易趣網(wǎng)做的一些不好的事情准脂,不久前允許賣家將執(zhí)行 JS 在頁面中使用只能使用這些字符,但它是一個相當罕見的攻擊向量檬洞。有些人說混淆狸膏,但事實上,有更好的方法混淆添怔。

最后湾戳,希望你會喜歡本次探秘之旅贤旷。


資源:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市砾脑,隨后出現(xiàn)的幾起案子幼驶,更是在濱河造成了極大的恐慌,老刑警劉巖韧衣,帶你破解...
    沈念sama閱讀 218,451評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件盅藻,死亡現(xiàn)場離奇詭異,居然都是意外死亡畅铭,警方通過查閱死者的電腦和手機氏淑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來硕噩,“玉大人假残,你說我怎么就攤上這事÷茫” “怎么了守问?”我有些...
    開封第一講書人閱讀 164,782評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坑资。 經(jīng)常有香客問我耗帕,道長,這世上最難降的妖魔是什么袱贮? 我笑而不...
    開封第一講書人閱讀 58,709評論 1 294
  • 正文 為了忘掉前任仿便,我火速辦了婚禮,結(jié)果婚禮上攒巍,老公的妹妹穿的比我還像新娘嗽仪。我一直安慰自己,他們只是感情好柒莉,可當我...
    茶點故事閱讀 67,733評論 6 392
  • 文/花漫 我一把揭開白布闻坚。 她就那樣靜靜地躺著,像睡著了一般兢孝。 火紅的嫁衣襯著肌膚如雪窿凤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評論 1 305
  • 那天跨蟹,我揣著相機與錄音雳殊,去河邊找鬼。 笑死窗轩,一個胖子當著我的面吹牛夯秃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仓洼,長吁一口氣:“原來是場噩夢啊……” “哼介陶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起色建,我...
    開封第一講書人閱讀 39,241評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哺呜,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镀岛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弦牡,經(jīng)...
    沈念sama閱讀 45,686評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡友驮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,878評論 3 336
  • 正文 我和宋清朗相戀三年漂羊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卸留。...
    茶點故事閱讀 39,992評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡走越,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出耻瑟,到底是詐尸還是另有隱情旨指,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評論 5 346
  • 正文 年R本政府宣布喳整,位于F島的核電站谆构,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏框都。R本人自食惡果不足惜搬素,卻給世界環(huán)境...
    茶點故事閱讀 41,336評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望魏保。 院中可真熱鬧熬尺,春花似錦、人聲如沸谓罗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽檩咱。三九已至揭措,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間刻蚯,已是汗流浹背蜂筹。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芦倒,地道東北人艺挪。 一個月前我還...
    沈念sama閱讀 48,173評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親麻裳。 傳聞我的和親對象是個殘疾皇子口蝠,可洞房花燭夜當晚...
    茶點故事閱讀 44,947評論 2 355

推薦閱讀更多精彩內(nèi)容