
最適化や知的財産保護を目的とした、強力なウェブサイトコンパイラ/難読化ツール。

WebSafeCompiler (WSC) は、Node.js を使用した Web アプリケーションおよび Web サイトの最適化、圧縮、および難読化 (必要な場合) のために設計された高度なユーティリティ (Web サイトコンパイラ) です。ファイルサイズを削減したり、リバースエンジニアリングに対する耐久性のある保護を提供することで Web アセットを強化し、コードをデプロイ可能で安全な状態にします。
[!NOTE]
*.github.io サイトに適しています
コンパイラはモノリシックです。すべての実装は source/wsc.js にあります。回帰テストは別途 tests/ にあります。
WebSafeCompiler の潜在能力を最大限に活用するには、ターミナルで次のコマンドを実行してください:
node wsc.js <input_dir> <output_dir> [--map] [--smart] [--drm]
<input_dir>: 処理対象のソースファイルを含むディレクトリ。<output_dir>: 最適化および難読化されたファイルが出力されるディレクトリ。-m, --map: SEO 向上のために出力ディレクトリに sitemap.xml を作成します-s, --smart: 圧縮されたファイルを自動検出してスキップします。これには JS および CSS ファイルが含まれます。-d, --drm: 不正な解析からソースコードを保護するためのコード難読化 (DRM 保護) を有効にします。
class、id、title の値をエンコードします。既存のクラス名と属性は保持されます。検出されたセレクタおよび DOM 検査の依存関係は、コンソール警告とともにノイズを制限します。-h, --help: 詳細な使用方法を含むヘルプメッセージを表示します。-v, --version: WebSafeCompiler の現在のバージョンを出力します。node wsc.js "/path/to/source" "/path/to/output" --drm --smart
このコマンドは、指定されたソースディレクトリ内のすべてのファイルを処理し、最適化します。また、難読化フラグが有効になっている場合は、不正アクセスや改ざんからコードを保護します。出力ファイルは、Web環境にデプロイできる状態になります。

WebSafeCompiler は、JavaScriptコードを扱うために以下のライブラリを使用しています:
WebSafeCompiler を使い始めるには、システムに Node.js がインストールされている必要があります。必要なパッケージをインストールするには、以下の手順に従ってください:
Node.jsのインストール: Node.js公式サイト からNode.jsをダウンロードしてインストールします。お使いのオペレーティングシステムのインストール手順に従ってください。
リポジトリのクローン: まだクローンしていない場合は、リポジトリをローカルマシンにクローンします:
git clone <repository-url>
cd <repository-directory>/source
依存関係のインストール: プロジェクトディレクトリに移動し、必要なnpmパッケージをインストールします:
npm install
完了!WSCを使用できます。
WSCはHTMLタグ/属性の空白を最小化し、通常のHTMLコメントを削除しますが、引用符で囲まれた値、テキストの空白、生のscript/style本体、条件付きコメント、フレームワークマーカーは保持します。ソース/コメントの検査が検出されると、警告とともにこれらのマークアップ編集が無効になります。JavaScriptはローカル名のマングリングと5回の圧縮パスを使用し、パブリックグローバルと関数名を保持します。DRMは制御フローの平坦化、デッドコードの注入、およびbase64エンコーディングによる完全な文字列配列カバレッジを保持します。CSSは解析および最小化されます。パーサーの警告が出た未対応のJSおよびCSSは、警告とともに変更されずに保持されます。非UTF-8アセットは変換されずにコピーされます。ローカルのSRIアセットはHTMLより先に処理され、その後、script、stylesheet、preload、テンプレート参照の最終バイトからSHA-256/384/512メタデータが再計算されます。アクセス可能なCSPポリシー内の一致する外部スクリプトハッシュも更新されます。共有アセットは、参照元のページのいずれかでCSPが利用できない場合、またはUTF-8として安全に書き換えられない場合、DRM警告とともに変更されずに保持されます。無効なSRIメタデータはブロックされたままです。外部でホストされているアセットは書き換えられません。
DRMは、既存のclass属性にランダムなクラスを追加し、対象となる通常のHTMLタグの実際の各属性の周囲に2つのランダムな不活性属性を追加します。ランダム名は、HTML、CSS、およびJSのソーステキストに対してチェックされます。クラスの等価性/部分文字列セレクタは、影響を受けるクラス値を保持します。AST分析は、各ページとそのローカルJS/CSS依存関係を使用して、静的に識別された要素、不変エイリアス、およびオブザーバーサブツリーにクラス/属性の検査をスコープします。無関係な要素には依然としてノイズが付与されます。不明なレシーバー、実行時セレクタ、分割代入、および未解決のオブザーバーは、保守的なフォールバックを使用し、警告を出力します。script/style/meta/noscriptタグ、カスタム要素、および外部のSVG/MathMLノードにはジャンク属性が付与されません。これらのガードは既知の依存関係をカバーしていますが、動的に計算されるセレクタやリフレクションは常に静的に推論できるわけではありません。
DRMモードでは、WSCはサポートされているCSP構成(ルートの_headers、ルートのvercel.json(headersルール)、またはHTMLのCSPメタタグ)が適用される場合、対象となるインラインJavaScriptを各HTMLドキュメントの隣にある難読化されたwsc-inline-*.jsファイルに自動的に抽出します。出力ポリシーのscript-src-elemに'self'を追加し、他のソース権限、イベントハンドラー用のscript-srcルール、および無関係なディレクティブを保持します。これは意図的にスクリプト権限を同一オリジンのファイルに広げるものです。生成されたJavaScriptとヘッダー構成をHTMLと一緒にデプロイしてください。nonceは変更されません。生成されたファイルにはSRIハッシュが含まれます。リテラルルートと*ワイルドカードがサポートされています。
生成されたscriptタグは元の位置に留まります。クラシックスクリプトはパーサーブロッキングのままで、srcを追加する際に無視されたインラインのasync/defer属性は削除されます。モジュールは属性を保持し、相対インポートの解決を維持するためにファイルはドキュメントの隣に出力されます。インポートマップ、データスクリプト、スタイル、イベントハンドラーはインラインのままです。
WSCは抽出が利用できない場合に警告を出力します:外部/不明なCSP、サポートされていないルート、strict-dynamic、<base href>、非同期スクリプト、テンプレートスクリプト、無効なJavaScript、またはdocument.currentScript.src、import.meta、document.writeなどの検出されたソース/URL依存関係。可能な場合は代わりにインラインコードを難読化し、アクセス可能なポリシー内のSHA-256/384/512ハッシュを更新します。元のスクリプトソースを読み取るコードと、アクセス可能なポリシーがないコードは変更されません。document.currentScript.src、document.write/writeln、import.meta、テンプレートスクリプトの読み取りは抽出を妨げますが、CSPがアクセス可能な場合はインライン難読化を無効にしません。テンプレートの実行とソースURLは保持されます。既存のポリシーで禁止されているスクリプトは新たに認可されません。DRMなしの場合、対象となるインラインJavaScriptは圧縮され、CSPがアクセス可能な場合はそのハッシュが更新されます。それ以外の場合は元のソースが警告とともに保持されます。外部JS処理とHTML属性エンコーディングはDRMでも有効のままです。独立して提供される追加のHTTPポリシーはプロジェクトポリシーと一致する必要があります。任意のソースリフレクションとタイミング依存関係は静的解析によって普遍的に推測することはできません。
入力ディレクトリと出力ディレクトリは重複してはなりません。入力シンボリックリンクは追跡され、その内容はリンクの相対パスの下にコンパイルされます。ディレクトリサイクルと出力への入力リンクは警告とともにスキップされます。既存の出力リンクは意図しない書き込みを防ぐために拒否されます。
sourceからブラウザ回帰スイートを実行します(テストランナーにはNode.js 18以降が必要):
npm install
npx playwright install chromium
npm test
テストは tests/browser.js にあります。スイートは OS の一時ディレクトリに意図的に不正な形式のサイトを作成し、デスクトップとモバイル幅で 4 つのフラグの組み合わせにおけるブラウザの動作とスクリーンショットを比較します。実際に出力された JS ファイル、実行順序、無視されたインラインの async/defer 属性、モジュールインポート、生成された SRI、出力された _headers/vercel.json からの CSP、および外部で管理される CSP をチェックします。また、スコープ付き属性/クラスの検査、オブザーバーのサブツリー、動的セレクターのフォールバック、難読化された document.write と import.meta、テンプレートスクリプトの挿入、複数のアルゴリズムとパディングなしハッシュによる生バイト SRI、preload/CSS SRI、ブロックされた不一致の integrity、strict-dynamic、ベース URL、および非同期実行もチェックします。DRM スキップは、スマートモード、エンコーディング、サポートされていない JS、アクセスできない SRI/CSP、外部スクリプト、イベントハンドラーなど、影響を受けるファイルまたは要素と理由を報告します。ブラウザの CSP 違反はテストを失敗させます。フィクスチャとスクリーンショットは検査用に出力された一時ディレクトリに残ります。PowerShell でインストール済みの Microsoft Edge を使用するには:
$env:WSC_BROWSER_CHANNEL = 'msedge'
npm test
このプロジェクトは MIT ライセンスの下でライセンスされています。詳細については、LICENSE ファイルを参照してください。