よくある質問
一般的な質問
JavaScript の難読化とその仕組みに関するよくある質問です。
コードを保護する理由は数多くあります。たとえば、成果物を単純にコピーされるのを防ぐこと(HTML5 ゲームなどクライアントサイドのプロジェクトでは特に重要です)、コードの理解や改変を難しくすること、そしてまだ支払いを受けていない成果物を保護し、ソースコードを渡さずに動作するビルドをクライアントに見せられるようにすることなどが挙げられます。
標準的な難読化は、JavaScript を読みにくい JavaScript に書き換えます。名前は置き換えられ、文字列は移動・エンコードされ、制御フローは再構成されますが、結果は依然としてデバッガーでステップ実行できる JavaScript です。VM(バーチャルマシン)難読化は関数の本体を独自のバイトコードにコンパイルし、それを実行する組み込みのインタープリターを同梱するため、保護されたロジックはもはや JavaScript としては存在しません。どの関数が対象になり、どのように選択するかについては VM 難読化 を参照してください。
はい。vmTargetFunctionsMode を comment に設定し、保護する各関数に /* javascript-obfuscator:vm */ を付けます。難読化の前に実行されるビルド工程でも、これらのコメントを残してください。特定の関数を対象にするを参照してください。
いいえ。API キー、シークレット、認証情報をフロントエンドのコードに保存しては絶対にいけません。どれほど強力な難読化を施しても、フロントエンドの JavaScript に含まれるデータは、その気になった攻撃者に抽出されてしまいます。難読化はリバースエンジニアリングを難しくしますが、暗号化ではないため、機密情報の保護を難読化に頼るべきではありません。シークレットはバックエンドのサーバーに保存し、サーバー側で環境変数を使い、API 呼び出しをバックエンド経由にしてキーを隠すか、サーバーが発行する短命のトークンを使用してください。
難読化は、解析を行うのが人間、ツール、AI アシスタントのいずれであっても、コードの理解や変更に必要な労力を増やしますが、リバースエンジニアリングが不可能になる保証はありません。攻撃者が制御する環境では実行時の動作を観察できます。秘密情報と最終的なセキュリティ判断はサーバー側に置いてください。 VM がコードを変換する仕組み.
まずランタイム防御が原因でないかを確認してください。VM Self Defending と VM Debug Protection は、自動化ツール、ヘッドレスブラウザー、デバッガーの下や、target が実際の実行環境と一致しない場合に、意図的に実行を壊します。機能テストは、これらを無効にした別のテストビルドで実行してください。そのビルドでも壊れる場合は、vmTargetFunctionsMode: 'comment' を使って関数を 1 つずつ仮想化し、問題を絞り込みます。トラブルシューティングガイドでは、各手順とバグ報告に含める内容を説明しています。
難読化ツールはコードを追加します。識別子には生成された名前が付けられ、文字列はアクセス用の関数とともに文字列配列に移され(エンコードは任意)、VM 難読化ではバーチャルマシンのインタープリター全体がバイトコードとともに同梱されます。サイズについては過度に心配する必要はありません。難読化されたコードは gzip や Brotli でよく圧縮され、ほとんどのサーバーではこれらがデフォルトで有効になっています。
重いプリセットは出力サイズや実行時間を増やす場合があります。固定の低速化倍率に頼らず、自分のコードの起動時間、頻繁に実行される処理、圧縮後のバンドルサイズを測定してください。 オプションリファレンス · ベストプラクティス
いいえ。出力を書き換えると壊れる場合があります。特に、コードの変更を検知する Self Defending や VM Self Defending を使っている場合です。難読化の前にミニファイアーを実行することはできますが、/* javascript-obfuscator:vm */ などの javascript-obfuscator コメントを残すようにしてください。
ソースコードは保存しません。JavaScript の基本的な難読化はブラウザー内で実行されます。VM 難読化と HTML 難読化ではソースがサーバーに送信され、処理された後に破棄されます。リクエストが 4.4 MB を超える場合、Team プランと Business プランでは、処理後に削除される一時ストレージにアップロードされます。不正利用への対応と利用状況の分析のため、難読化された各出力の SHA-256 ハッシュと、使用された一部の設定(プリセット、ターゲット、VM の防御など)を 3 か月間保持します。コード自体やその内容は一切保持しません。ダッシュボードの履歴はブラウザー内にのみ保存されます。履歴画面で管理できます。
いいえ。難読化ツールは元の名前、コメント、書式を保持しないため、出力をソースコードに戻すことはできません。これはセキュリティ上の保証ではありません(上の難読化の解除に関する質問を参照)が、元のコードは必ず安全に保管しておく必要があります。
はい。難読化オプションでターゲットとして「Node」を選択すると、出力が Node.js 環境向けに最適化されます。
難読化された出力は、VM インタープリターや Self Defending 層を含めて、エバーグリーンなデスクトップブラウザーと iOS 16 以降(おおむね直近 4 年間)で積極的にサポートし、テストしています。それより古いブラウザーについては、ES2015 のモジュールサポートを下限としてベストエフォートで動作します。それを下回る環境(Internet Explorer を含む)は対象外です。
VM 保護については料金プランをご覧ください。標準の難読化は無料のオンラインプレイグラウンドでお試しいただけます。ひととおりの流れははじめにガイドで解説しています。
料金とアカウント
プラン、請求、使用量の上限に関する質問です。
使用量は、入力したソースコードのサイズ(バイト単位)で計測されます。公平なリソース配分のため、1 回の難読化ジョブにつき最小 0.1 MB(102,400 バイト)が計上されます。たとえば 50 KB のファイルを難読化した場合、クォータからは 0.1 MB が消費されます。0.1 MB を超えるファイルは、実際のサイズ分が計上されます。
VM 難読化の上限に達した後も、標準(ブラウザーベース)の難読化は上限なしで無料で利用し続けられます。有料プランでは、VM クォータは年間プランも含め、サブスクリプション開始日を基準に毎月同じ日にリセットされます。Free プランの上限は生涯上限であり、リセットされません。1 日あたりの VM 上限があるプランでは、その上限に達しても翌日には再び VM で難読化できます。より多くの VM 難読化クォータが必要な場合は、いつでもプランをアップグレードできます。
はい、いつでもプランのアップグレードおよびダウングレードが可能です。アップグレードの場合は、現在の請求期間の残り日数に応じた日割り金額が請求されます。ダウングレードの場合は、次回の請求サイクルから新しい料金が適用されます。
サブスクリプションはいつでも解約できます。現在の請求期間の終了までは、引き続きプランをご利用いただけます。なお、請求期間の途中での解約や未使用期間についての返金は行っておりませんのでご了承ください。
安全な決済代行サービスである Stripe を通じて、主要なクレジットカード(Visa、Mastercard、American Express)およびデビットカードをご利用いただけます。すべての取引は暗号化され、PCI 準拠で処理されます。
