難解プログラミング言語を整える
中級JSFuckを整える。
= 記号6文字「[ ] ( ) ! +」だけで JavaScript を書く言語への変換器
① 変換したい文字列・コードを入れる
ふつうの文字列でも、JSのコード片でも構いません。「実行可能な形にする」を選ぶと、入力をコードとして実行する式に変換します(このページでは実行しません)。
英大文字・記号・日本語・絵文字は「復元用の仕掛け」を毎回埋め込むため、1文字ごとに数千文字ふくらみます。長い入力ほど重くなるので、まずは短い文字列で試すのがおすすめです。
② 変換結果
[ ] ( ) ! + の6文字だけで構成されています。
③ 文字数の比較
JSFuckは種類を6文字に絞る代わりに、長さが大きく膨張します。
元の文字数
0
変換後の文字数
0
倍率
0倍
④ 部品の内訳(1文字ずつ、こう作る)
先頭最大40文字ぶんの内訳です(それ以降は省略)。
| 文字 | 部品 | 式(先頭のみ表示) | 文字数 |
|---|
なぜ6文字だけで動くのか・4つ
JavaScript の「なんでも変換しちゃう」性質を逆手に取る。
- 1
配列と論理値だけで false / true / 0 / 1 が作れる
空配列
[]は「!」を付けるとfalse、2回付けるとtrueになります (JavaScriptは空配列を「真の値」とみなすため、![]は false)。 さらに単項の+を付けると数値に変換され、+[]は 0、+!![]は 1 になります。 - 2
論理値や配列に「+ []」を足すと、文字列になる
![]+[]は文字列"false"、!![]+[]は"true"、[][[]]+[]は"undefined"になります。 こうして「文字を含む文字列」を、記号だけの式から手に入れます。 - 3
文字列は配列のように添字で1文字ずつ取り出せる
"false"[1]は文字"a"。添字の1も①の方法で作れるので、(![]+[])[+!![]]という式だけで"a"が手に入ります。この表の「direct」がこの方式です。 - 4
それでも無い文字は、Function経由で"復元"する
「false」「true」「undefined」「NaN」 の中に出てこない文字(大文字の多くや記号・日本語・絵文字)は、 いったん
[]["filter"]["constructor"](=Function)にたどり着き、 「return"あ"」のような 文字コード指定(あのコード)を含む文字列を 1個のコードとして組み立てて実行させ、その文字を復元します。この表の「escape」がこの方式で、 毎回「Functionにたどり着くための部品一式」を埋め込むぶん一気に長くなります (JSFuckには変数が無く、使い回しができないため)。
送信ゼロ・実行ゼロ
変換はすべてこの端末の中だけで完結します(送信ゼロ)。そして このページでは、変換した式を一切実行しません(実行ゼロ)。 「実行可能な形にする」を選んでも、生成されるのは「実行する式」という文字列だけで、 このページ自身がそれを走らせることはありません。本番のセキュリティポリシー(CSP)にも コード文字列を実行する仕組み(eval等)を許可する設定は入っていません。
このツールについて
JSFuck は `[ ] ( ) ! +` の6文字だけで書く JavaScript のエソラング(2012年 aemkei 作)。このツールは文字列やコードをJSFuck式へ変換するだけで、変換した式をこのページ上で実行することは一切ありません(送信ゼロ・実行ゼロ)。
任意の文字列やコードを [ ] ( ) ! + の6文字だけの式に変換。文字数の比較と部品の内訳("a" はこう作る…)つき。このページでは変換した式を実行しません。
主な機能
- [ ] ( ) ! + の6文字だけへ変換
- 「実行可能な形にする」で実行用の式にも変換
- 元/変換後の文字数比較と倍率表示
- 文字ごとの部品内訳表(direct/digit/escape)
- 型変換の仕組みの解説
- 実行ゼロ・送信ゼロ
よくある質問
Q. JSFuck とは何ですか?
A. [ ] ( ) ! + の6種類の記号だけで任意の JavaScript を表現する言語です(2012年・Martin Kleppe)。JavaScript が配列や論理値を数値・文字列へ自動で変換する性質を利用しています。
Q. なぜ変換すると文字数が何千倍にも増えるのですか?
A. JSFuck には変数が無く、1文字作るたびに元になる仕組み(false/true の文字列化や Function への経路)を毎回まるごと埋め込む必要があるためです。特に大文字・記号・日本語は1文字で数千文字になります。
Q. このページで変換した式は実行されますか?
A. いいえ。変換はブラウザ内で完結し(送信ゼロ)、生成した式をこのページが実行することはありません(実行ゼロ)。「実行可能な形にする」を選んでも、できるのは「実行する式」という文字列だけです。
Q. 「実行可能な形にする」を選ぶと何が変わりますか?
A. 入力をそのまま文字列として表す式ではなく、[]["filter"]["constructor"](コード)() という「入力をコードとして実行する式」に変換します。実際に走らせるかどうかは、その式を受け取った側の判断です。
Q. 内訳表の direct・digit・escape の違いは?
A. direct は 「false」「true」「undefined」「NaN」 の文字列から直接1文字を取り出す方式、digit は 0〜9 の数値式、escape はそれ以外の文字を Function 経由で復元する方式です。escape は1文字で数千文字になります。
入力値はURLの「#」以降に入るためサーバーには送信されません。リンクを開くと同じ状態を復元します。