跳至內容

JSFuck

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 00:37 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

JSFuck(抑是為著欲忌剋話 Fuck 寫作JSF \ * ck)是一種深奧的 JavaScript 程式設計風格。用這款風格寫做的代碼中干焦使用 ` [`、`] `、` ( `、` ) `、` ! ` 和 ` + ` 六種字元。現此程式設計風格的名衍生自從使用較少符號寫代碼的 Brainfuck 語言。佮其他深奧的程式語言無仝,以 JSFuck 風格寫出的代碼無需要另外的編譯器抑是直譯器來執行,無論瀏覽器抑是 JavaScript ia̋n-jín 中的原生 JavaScript 直譯器攏會當直接執行。鑑於 JavaScript 是弱型別語言,編寫者會當用數量有限的字元重寫 JavaScript 中的所有功能,而且會當用這種方式執行任何類型的表達式。

緣起

長谷川陽介(Yosuke Hasegawa)佇二空空九年七月建立一个叫做「jjencode」的網路應用程式,我會當將一切的 JavaScript 代碼透濫為 ` [ ] ( ) ! + , \ " $ . : ; _ { } ~=` 這十八字元的排列組合。

二空一空年一月,佇一个 Web 應用程式安全徛點上的「透濫」版塊內底,舉行一場非正式的競賽。這場競賽的目標是欲予 JavaScript 程式設計共所需要的上少字元降至八个以下(` [ ] ( ) ! + , / `), 這帖文的回覆者設法消除了著 ` , ` 和 ` / ` 字元的需求。截至二空一空年三月,網路頂懸有一个名「JS-NoAlnum」線頂編碼器,伊只使用六字元來透濫 JavaScript。

二空一空年底,長谷川陽介製作一个叫做 JSF \ * ck 的新編碼器,伊只使用六字元來混淆 JavaScript。二空一二年,馬丁 ・ 克萊普佇 GitHub 上建立一个編碼器專案「jsfuck」,並建立了 JSFuck . com 網站,𫞼一个使用這編碼器實現的 Web 應用程式。

用途佮安全性

JSFuck 會當用佇咧代碼透濫,一个最佳化版 JSFuck 編碼器已經予人用於混淆 jQuery 代碼,使這一流行的 JavaScript 函式庫會當干焦使用六字元來實現原本的所有功能。

此外,JSFuck 會當用著踅過惡意代碼檢測,而且會當予人用佇跨站指令碼攻擊。因為欠原生 JavaScript 應該有的特徵,類似 JSFuck 的 JavaScript 透濫技術會當幫助惡意代碼踅過入去侵防禦系統抑是內容過濾器。現實中,因為乎 JSFuck 中欠字母數字元,而且 eBay 中的內容過濾器捌存在欠缺,共賣的曾經會當佇𪜶的 eBay 拍賣頁面中樞入任意 JSFuck 指令碼。

編碼方式

JSFuck 代碼是躼躼長。佇咧 JavaScript 中,` alert ( " Hello World " ) ; ` 這代碼會致使彈窗並顯示「Hello World」字捾,這代碼的長度為二十一字元。咧使用 JSFuck . com 提供的 JSFuck 透濫程式了後,轉換出對應的仝款效果代碼長度是二石四千六百九十一字元。自本節概述此轉換方式的工課原理。

數字

數字零使用 ` + [] ` 來構造,其中 ` [] ` 代表空陣列,而且 ` + ` 是一箍加運算子。 數字一則以 ` + ! ! [] ` 抑是 ` + ! + [] ` 來構造,其中 ` ! ! [] ` 抑是 ` ! + [] ` 代表布林值為真(` true `), 前輩的一箍加運算子將真值轉換做數字一。 數字二至九則以將「真」加佮濟改轉換做數值的類似方式來構造。比如講,由 ` true + true ` 這一表達式佇 JavaScript 中輸出結果為二,閣 ` true ` 通好寫作 ` ! ! [] ` 抑是 ` ! + [] `,故二可轉寫作 ` ! ! [] + ! ! [] ` 抑是 ` ! + [] + ! + [] `。 多位的整數則會當將各數位分別表示,並使用串接運算子 ` + ` 進行字串串接。譬如講字捾 ` " 十 " ` 會當表達為兩个陣列串接的形式(` [一] + [零] `), 共各數位替換做對應的 JSFuck 表達式了後,即可將這字串表達為 ` [+ ! + [] ] + [+ [] ] `;若欲共字串轉化做數字,會當共前述的表達式括號抑是括號,並且加一个 ` + ` 運算子,所以,數字值十會當佇咧 JSFuck 中表達為 ` + ( [+ ! + [] ] + [+ [] ] ) `。

字母

通過使用索引器(即方括號中的數字)的方式,會當存取簡單布林值抑是數值對應字串表示形式(如 ` false `、` true `、` NaN `、` undefined `)中的單字元,而且 JSFuck 會當藉此轉換一部份的字母。此外,轉換另外一部份的字母需要其他的技巧,比如講共字串 ` 一 e 一千 ` 轉換做數字,按呢就會產生無窮大值(` Infinity `), 而且 ` Infinity ` 中的字元會當用取得字母 ` y `。

其他構造方法

佇咧 JavaScript 中,` Function ` 函式這款構造器會當予人用於觸發執行包含佇字串中的 JavaScript 代碼,當如像執行原生 JavaScript 代碼彼號。比如講,語句 ` alert ( 一 ) ` 等價於 ` Function ( " alert ( 一 ) " ) ( ) `。而且 ` Function ` 構造器佇 JavaScript 中是任何常用函式的 ` constructor ` 屬性,此所講的常見函式指出來是像 ` [] [ " filter "] `(即 Array . prototype . filter)類的函式。所以,這个構造器便會當通過存取一个空陣列的 ` filter ` 屬性下的 ` constructor ` 屬性來構造。比如講,` alert ( 一 ) ` 會當予人等價轉換做 ` [] [ " filter "] [" constructor "] ( " alert ( 一 ) " ) ( ) `,並使用 JSFuck 進一步轉換。

備註

對於「編碼方式」章節內底的內容:

參考來源

外部連結

  • [/ / web . archive . org / web / 二十五空一千八百空七孵空一百空三孵一千四百三十九 / http : / / www . jsfuck . com / 頁面存檔備份,存在網路檔案館)JSFuck-Write any JavaScript with 六 Characters : [] ( ) ! + ]–共原生 JavaScript 轉換做 JSFuck 的 Web 應用程式
  • Yosuke Hasegawa 創作的 JSF \ * ck 線頂應用
  • JSfuck . com 咧用的轉換指令碼