機能
JavaScript 難読化ツールは、スクリプトをまったく同じように動作させたまま、人が読んだりコピーしたりするのをはるかに難しくするように書き換えます。変数名や関数名は _0x3f2a のような意味のない識別子になり、文字列リテラルはエンコードされた参照テーブルに移され、強度を上げると制御フローが入れ替えられ、デッドコードが混ぜ込まれます。
素の JavaScript として配布するブラウザゲーム、デモ、ウィジェット、ライセンスチェックなどを、そのままコピーされたくない場合に便利です。
使い方
- JavaScript を貼り付けるか、
.jsファイルを開きます。 - 強度 を選びます:
- 低 はローカル名を変更し、文字列を参照用の配列に移します。出力は高速で、比較的小さいままです。
- 中 は文字列のエンコード、制御フローの平坦化、少量のデッドコードを追加します。
- 高 はすべてを最大の強度で適用します。結果は何倍も大きくなり、目に見えて遅くなることがあります。
- スクリプトの外からトップレベルの関数や変数を参照しているものがない場合に限り、グローバル名も変更 をオンにします。
- 結果を複数行に分けたい場合は 1 行で出力 をオフにします。
- 難読化したコードをコピーまたはダウンロードし、デプロイ前にテストします。
例
サンプルは greet 関数と訪問カウンターを定義しています。強度「低」で難読化すると、コードは 16 進数の名前が並ぶ 1 行になりますが、実行すると今までどおり Hello, Ada! You have visited 1 time(s). と出力されます。
難読化と minify の違い
JavaScript・CSS 圧縮ツールが行う minify は、空白を取り除き名前を短くして、ファイルを小さくダウンロードを速くします。難読化はサイズの面では逆で、コードを理解しにくくするために意図的に間接的な処理を加えます。多くのプロジェクトでは、すべてを minify し、守る価値のあるロジックを含む一部のファイルだけを難読化しています。
制限
難読化では秘密情報を守れません。ブラウザが実行できるものは、いずれユーザーが調べられます。API キーや非公開にすべきビジネスルールはサーバー側に置いてください。また、強い設定はコードを遅くするため、頻繁に実行されるループやパフォーマンスが重要なページでは避けましょう。
よくある質問
› 難読化でコードの動作は変わりますか?
いいえ。難読化したスクリプトは元のスクリプトと同じように動作し、変わるのは形だけです。ただし自身のソースや関数名を調べるコードは動作が変わることがあるため、必ず難読化したビルドに対してテストを実行してください。
› 難読化したコードは元に戻せますか?
完全には戻せませんが、時間をかければ、その気になった人が動作を解明することはできます。難読化は気軽なコピーを防ぐ減速帯と考え、API キーなどの秘密情報を隠す場所としては決して使わないでください。
› 「グローバル名も変更」はいつオンにすべきですか?
スクリプトが自己完結している場合だけです。グローバル名を変更すると、トップレベルの関数を名前で呼び出している HTML 属性、他のスクリプト、テストが動かなくなります。
› コードはアップロードされますか?
いいえ。難読化はオープンソースの javascript-obfuscator ライブラリを使ってブラウザ内で実行されます。