JSFuck

JSFuckはJavaScriptのサブセットである難解プログラミング言語で、コードはcodice_1、codice_2、codice_3、codice_4、codice_5とcodice_6の6文字で構成される。ネーミングセンスはBrainfuckを参考にしていて、難解プログラミング言語の中ではアルファベットが一文字も使われない。コンパイラやインタプリタを必要とするBrainfuckとは異なり、WebブラウザやJavaScriptエンジンで動作させることができる。JSFuckはJavaScriptが動的型付けのため、完全にJavaScriptの関数を上記の6文字で置き換えることができる。
2009年7月にハセガワヨウスケがJavaScriptをcodice_7の18文字に変換するWebアプリケーションを作った。
2010年1月には、sla.ckers.orgというWebアプリケーションセキュリティサイトの「Obfuscation」フォーラムで非公式の競争が開催され、文字数を当時必要最小限だと思われていた8文字（codice_8）に抑える方法が考案された。その後、どうにか codice_9 と codice_10 を使わないようにできないか模索され、同年3月にはJS-NoAlnumと呼ばれる現在の6文字で表現されるエンコーダーができた。同年11月にハセガワはJSF*ckと呼ばれる6文字で表現されるエンコーダーを完成させた。2012年には、Martin Kleppe が"jsfuck"と名前をつけたプロジェクトをGitHub上で公開した。そしてJSFuck.comというサイトでエンコーダーの実装を公開している。
JSFuckはマルウェアをウェブサイトにクロスサイトスクリプティング (XSS)等によって埋め込むことにも使われたことがある。他の潜在的な使用方法としては、難読化がある。よく使われるJavaScriptライブラリであるjQueryも、6文字で完全に置き換えられたことがある。
変換の手順.
JSFuckは非常に冗長である。JavaScriptではcodice_11としてポップアップを開くであろうコードは21字である。しかし、同じことをJSFuckでしようとすると22948字にもなる。いくつかの文字はJSFuckで表現しようとすると1000文字を超える。この節はどうやって文字を生成することができるのか説明する。
数字.
0はcodice_12によって作られる。ここで、codice_13は空の配列であり、codice_6はである。ここに型変換が働いて、は0とみなされる。
1はcodice_15 か codice_16で、論理値codice_17 (JSFuckではcodice_18かcodice_19として表現される)が数字の1に変換されたものである。
2から9については、（前述の通り1）をその回数だけ繰り返し、それをで連結すれば良い。これを踏まえると2はcodice_20やcodice_21と書くことができる。
2桁以上の場合は、1桁ずつ数字として配列に詰めたあと、それを1要素連結すればよい。例としてcodice_22はcodice_23と書き換えることができる。前述の0と1の作り方を適用すると、これはcodice_24となる。数値を返したい場合は、頭にをつける(この例ではcodice_25 = codice_26)
文字.
JSFuckではいくつかの文字は論理値や"NaN"、"undefined"から"添字付き"(角括弧の中に数字が入ったもの)で取り出すことになる。他の文字を生成するためにさらなるトリックが存在する。を数字に型変換すると、となり、を簡単に取り出すことができるようになる。下に記したのは最もシンプルにプリミティブな値を作るコードである。
例:"a"の生成.
JavaScriptで実際に試してみると、codice_40とcodice_41は同じ出力である。
他の生成.
codice_42のコンストラクタはJavaScriptとして有効なコードを実行することができるので、codice_43はcodice_44と同じである。codice_42のコンストラクタは、codice_46 (codice_47) のように関数のcodice_48プロパティから取り出すことができる。このことを踏まえると、codice_43はcodice_50と書き換えることができる。
文字表.
文字を作ることができる一番短いコードを下に記した。他の文字も生成できるがおそらくもっと長くなるだろう。
セキュリティ.
JSFuckのような難読化技術は、「通常の」JavaScriptに備わる"クラッキング防止システム"が存在しないため、eBayのオークションのページにJSFuckで書かれたスクリプトを埋め込むことができた。