オープンソースではないJavaScriptアプリケーションを作成したいので、JSコードを難読化する方法を学びたいのですが?これは可能ですか?
オープンソースではないJavaScriptアプリケーションを作成したいので、JSコードを難読化する方法を学びたいのですが?これは可能ですか?
回答:
難読化:
YUI Compressorをお試しください。これは非常に人気のあるツールであり、Yahoo UIチームによって構築、拡張、保守されています。
次のものも使用できます。
更新:この質問は元々10年以上前に尋ねられたものであり、YUIはもはや維持されていません。Google Closure Compilerは現在も使用されており、UglifyJSはノードパッケージマネージャーを介してローカルで実行できます。npm install -g uglify-js
プライベート文字列データ:
文字列値をプライベートに保つことは別の問題であり、難読化は実際にはあまりメリットがありません。もちろん、ソースを文字化けした縮小化された混乱にパッケージ化することにより、あいまいさによる軽いバージョンのセキュリティが得られます。ほとんどの場合、ソースを表示しているのはユーザーであり、クライアントの文字列値はその使用を目的としているため、多くの場合、プライベート文字列値は必要ありません。
ユーザーに見てほしくない値が本当にある場合は、いくつかのオプションがあります。まず、ページの読み込み時に復号化されるある種の暗号化を行うことができます。これはおそらく最も安全なオプションの1つですが、不要な作業もたくさんあります。おそらく、いくつかの文字列値をbase64エンコードできますが、それは簡単です。しかし、それらの文字列値を本当に望んでいる人なら、簡単にデコードできます。暗号化は、誰もがデータにアクセスすることを完全に防ぐ唯一の方法であり、ほとんどの人は、必要以上のセキュリティを確保できると考えています。
サイドノート:
JavaScriptの難読化は、いくつかのバグを引き起こすことが知られています。難読化ツールは少し改善されていますが、多くの服装は縮小とgzipによる十分なメリットがあると判断し、難読化による追加の節約が必ずしも問題に値するわけではありません。ソースを保護しようとしている場合は、コードを読みにくくするために、それだけの価値があると判断するかもしれません。JSMinは良い代替手段です。
--preserve-semi
ます。通常、プライベート変数をa、b、cなどに書き換えることは安全です。もう1つのことは、コードの各セミコロンの後にミニファイアに改行を入れることです--line-break 0
。次に、本番環境でエラーが発生した場合、有効な参照行が最低限あり、開発コピーでそのコードを見つけることができます。そうしないと、大量のコード行でエラーが発生し、エラーの場所がわからなくなります。
GoogleのClosure Compilerについて誰も言及していないことに驚いています。それは単に縮小/圧縮するだけでなく、未使用のコードを見つけて削除するために分析し、最大の縮小のために書き直します。また、型チェックを行うことができ、構文エラーについて警告します。
JQueryは最近、YUI CompresserからClosure Compilerに切り替わり、「確実な改善」が見られました
難読化は実際には機能しません。あなたのコードを本当に使いたいと思っている人にとっては、それは単なるスピードバンプです。さらに悪いことに、ユーザーがバグを修正する(および修正をお客様に返送する)ことができなくなり、現場での問題の診断が困難になります。それはあなたの時間とお金の無駄です。
知的財産法とあなたの法的選択肢が何であるかについて弁護士に相談してください。「オープンソース」は「人々がソースを読むことができる」という意味ではありません。代わりに、オープンソースは、コードを自由に使用および変更する権限を付与する特定のライセンスモデルです。このようなライセンスを付与しないと、コードをコピーする人が違反し、(ほとんどの場合)あなたはそれらを阻止するための法的選択肢を得ることができます。
コードを本当に保護できる唯一の方法は、コードを出荷しないことです。重要なコードをサーバー側に移動し、公開されているJavaScriptコードにAjax呼び出しを実行させます。
あなたはあなたが望むすべてのjavascriptソースを難読化することができます、しかしそれはクライアントマシン上で実際に実行するためにすべてのソースコードを要求するという理由だけで常にリバースエンジニアリング可能でしょう...サーバー側のコードを使用し、クライアントコードのJavaScriptが行うすべての処理は、サーバー自体に処理要求を送信することです。それ以外の場合は、誰でもコードが実行しているすべての操作を常に追跡できます。
文字列を安全に保つために誰かがbase64について言及しました。これはひどい考えです。Base64は、コードをリバースエンジニアリングする必要のあるタイプの人々にすぐに認識されます。彼らが最初に行うことは、エンコードを解除して、それが何であるかを確認することです。
無料で利用できるJavaScript難読化ツールがいくつかあります。ただし、JavaScriptをリバースエンジニアリングできない程度に難読化することは難しいことに注意することが重要です。
そのために、私がある程度時間をかけて使用したいくつかのオプションがあります:
YUIコンプレッサー。Yahoo!のJavaScriptコンプレッサーは、ロード時間を改善するコードを圧縮する優れた機能を果たします。比較的うまく機能する難読化のレベルは小さいです。基本的に、Compressorは関数名の変更、空白の削除、ローカル変数の変更を行います。これは私が最も頻繁に使用するものです。これはオープンソースのJavaベースのツールです。
JSMinは、Douglas Crockfordによって作成されたツールで、JavaScriptソースの縮小を目指しています。Crockford自身の言葉では、「JSMinは難読化しませんが、醜くします」。主な目標は、ブラウザーでの読み込みを高速化するためにソースのサイズを小さくすることです。
無料のJavaScript難読化ツール。これは、実際にコードをエンコードしてコードを難読化しようとするWebベースのツールです。エンコード(または難読化)の形式のトレードオフは、ファイルサイズを犠牲にすることになると思います。しかし、それは個人的な好みの問題です。
[ZER0O00OIFY, ZER0000OIFY, ZEROO00OIFY, ZEROOO0OIFY]
、少なくとも[var1, var2,..]
1分以内にvarの束を見つけたり置き換えたりできなかった単一のプログラマを知りません。文字列の文字化け、再インデント、および検索/置換を2分以内で行うことができます。いいえ、私は平均的なジュニア開発者よりも賢いです。単純な事実は、クライアント側のJSを不明瞭にする方法はないということです。あなたは自分で5分、MAXを買うことができますが、それは無駄です。これは本当に、追加された「セキュリティ」のコードを知らない人を売るためだけのものです。JSの行を書いたことのある人は誰もそのがらくたを買うことはないでしょう。
私がすること:
A.ハッカーをトロールしてください!
これは、私の偽/難読化された秘密のJavaScriptコードLAUNCHERの2番目の部分になります。あなたがソースコードで見るもの。
このコードは何ですか?
var ajax=function(a,b,d,c,e,f){
e=new FormData();
for(f in d){e.append(f,d[f]);};
c=new XMLHttpRequest();
c.open('POST',a);
c.setRequestHeader("Troll1","lol");
c.onload=b;
c.send(e);
};
window.onload=function(){
ajax('Troll.php',function(){
(new Function(atob(this.response)))()
},{'Troll2':'lol'});
}
B.コードを少し難読化する
それは何ですか?
(new Function(atob('dmFyIGFqYXg9ZnVuY3Rpb24oYSxiLGQsYyxlLGYpe2U9bmV3IEZvcm1EYXRhKCk7Zm9yKGYgaW4gZCl7ZS5hcHBlbmQoZixkW2ZdKTt9O2M9bmV3IFhNTEh0dHBSZXF1ZXN0KCk7Yy5vcGVuKCdQT1NUJyxhKTtjLnNldFJlcXVlc3RIZWFkZXIoIlRyb2xsMSIsImxvbCIpO2Mub25sb2FkPWI7Yy5zZW5kKGUpO307d2luZG93Lm9ubG9hZD1mdW5jdGlvbigpe2FqYXgoJ1Ryb2xsLnBocCcsZnVuY3Rpb24oKXsgKG5ldyBGdW5jdGlvbihhdG9iKHRoaXMucmVzcG9uc2UpKSkoKX0seydUcm9sbDInOidsb2wnfSk7fQ==')))()
C実際のコードを含む、表示が難しいphpファイルを作成する
このphpコードは何ですか?
すべて問題なければ、適切なコードが表示され、それ以外の場合は偽のコードまたはIPを禁止し、ページを閉じます。
<?php
$t1=apache_request_headers();
if(base64_encode($_SERVER['HTTP_REFERER'])=='aHR0cDovL2hlcmUuaXMvbXkvbGF1bmNoZXIuaHRtbA=='&&$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){
echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';//here is the SECRET javascript code
}else{
echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';
};
?>
base64リファラー= http://here.is/my/launcher.html
シークレットjavascript = document.body.appendChild(document.createElement('div')).innerText='Awesome';
偽物= window.open('', '_self', '');window.close();
ここで.. SECRET JavaScriptでイベントハンドラーを定義する場合、おそらくアクセス可能です..起動コードを使用して外部で定義し、ネストされたSECRET関数を指す必要があります。
SO ...コードを取得する簡単な方法はありますか?
document.body.appendChild(document.createElement('div')).innerText='Awesome';
これが機能するかどうかはわかりませんが、クロムを使用して、要素、リソース、ネットワーク、ソース、タイムライン、プロファイル、監査をチェックしていますが、上の行は見つかりませんでした。
注1:ChromeでInspect element-> networkからTroll.phpのURLを開くと、偽のコードが表示されます。
注2:コード全体は、最新のブラウザー用に書かれています。polyfillにはさらに多くのコードが必要です。
編集する
launcher.html
<!doctype html><html><head><meta charset="utf-8"><title></title><script src="data:application/javascript;base64,KG5ldyBGdW5jdGlvbihhdG9iKCdkbUZ5SUdGcVlYZzlablZ1WTNScGIyNG9ZU3hpTEdRc1l5eGxMR1lwZTJVOWJtVjNJRVp2Y20xRVlYUmhLQ2s3Wm05eUtHWWdhVzRnWkNsN1pTNWhjSEJsYm1Rb1ppeGtXMlpkS1R0OU8yTTlibVYzSUZoTlRFaDBkSEJTWlhGMVpYTjBLQ2s3WXk1dmNHVnVLQ2RRVDFOVUp5eGhLVHRqTG5ObGRGSmxjWFZsYzNSSVpXRmtaWElvSWxSeWIyeHNNU0lzSW14dmJDSXBPMk11YjI1c2IyRmtQV0k3WXk1elpXNWtLR1VwTzMwN2QybHVaRzkzTG05dWJHOWhaRDFtZFc1amRHbHZiaWdwZTJGcVlYZ29KMVJ5YjJ4c0xuQm9jQ2NzWm5WdVkzUnBiMjRvS1hzZ0tHNWxkeUJHZFc1amRHbHZiaWhoZEc5aUtIUm9hWE11Y21WemNHOXVjMlVwS1Nrb0tYMHNleWRVY205c2JESW5PaWRzYjJ3bmZTazdmUT09JykpKSgp"></script></head><body></body></html>
Troll.php
<?php $t1=apache_request_headers();if(/*base64_encode($_SERVER['HTTP_REFERER'])=='PUT THE LAUNCHER REFERER HERE'&&*/$_POST['Troll2']=='lol'&&$t1['Troll1']='lol'){echo 'ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkuaW5uZXJUZXh0PSdBd2Vzb21lJzsNCg==';}else{echo 'd2luZG93Lm9wZW4oJycsICdfc2VsZicsICcnKTt3aW5kb3cuY2xvc2UoKTs=';}; ?>
JScramblerを試してください。最近ちょっと試してみて感動しました。詳細をあまり気にせず、すぐに完成させたい人のために、事前定義された設定で難読化用のテンプレートのセットを提供します。必要な変換や手法を選択して、カスタム難読化を作成することもできます。
インタープリター型言語の問題は、ソースを送信してそれらを機能させることです(バイトコードにコンパイラーがない限り、逆に逆コンパイルするのは非常に簡単です)。
したがって、パフォーマンスを犠牲にしたくない場合は、変数名と関数名のみを操作できます。それらをa、b ... aa、ab ...、またはa101、a102などに置き換えます。もちろん、可能な限り多くのスペース/改行を削除します(これはいわゆるJSコンプレッサーが行うことです)。
文字列を難読化すると、リアルタイムで暗号化および復号化する必要がある場合、パフォーマンスが低下します。さらに、JSデバッガーは最終的な値を表示できます...
私がYUI Compressorに対して提案する他のほとんどの回答とは対照的です。あなたはGoogle Closureを使うべきです。
それはより多くを圧縮するのでそれほどではありませんa = [1,2,3,];
が、IEを不安定にするようなJavaScriptエラーをキャッチするためです。
クライアント側のコードを保護することはできません。GoogleChromeでF12 キーを押し、JavaScriptの実行を一時停止すると、暗号化されたものも含め、すべての文字列を取得できます。美化して変数名を変更するすると、ほぼ元のコードが得られます。
サーバーサイドのjavascript(NodeJS)を書いているのが誰かがサーバーにハッキングするのを恐れており、ハッカーの作業をより困難にし、アクセスを取り戻すための時間をより多く与えたい場合は、javacriptコンパイラーを使用します。。
変数が複数のファイル/モジュールで使用されている場合でも、すべての変数の名前を変更する唯一のツールであるため、高度なコンパイルではClosure Compilerを使用する必要があります。ただし、問題があるだけです。コーディングスタイルで記述した場合にのみ機能します。
JavaScriptユーティリティをお勧めしますPatrick J. O'Neilによる。それは難読化/圧縮および圧縮することができ、これらはかなり良いようです。とは言え、私はそれをあらゆる種類のビルドスクリプトに統合しようとしたことはありません。
難読化と縮小化については、私は前者の大ファンではありません。これによりデバッグが不可能になり(1行目のエラー... "待機、1行しかありません")、展開に常に時間がかかります。しかし、あなたがする必要があるなら...まあ。
最初にYUI Compressorなどで縮小してから、次のようなものを使用してすべての文字列と数値をHEX値に変換することをお勧めします http:ます
これを使用すると、コードを理解することがほぼ不可能になり、この段階では、ハッカーがコードを再実行するのに、実際に最初から書いた場合よりも時間がかかると思います。書き換えと複製は、実際に停止できないものです。やっぱり自由人です!
ディーンエドワードのパッカーは優れた難読化ツールですが、コード内の文字列要素ではなく、主にコードを難読化します。
参照:オンラインJavascript圧縮ツール 、ドロップダウンからPacker(Dean Edwards)を選択
このツールをお試しください Javascript Obfuscator
HTML5ゲームで使用したところ、サイズが950KBから150に減少しただけでなく、ソースコードが判読不能なクロージャコンパイラとミニファイアを元に戻せるようになりました。この難読化を元に戻す方法を個人的に知りません。
私は長年Jasobを使用してきましたが、これは最高の難読化ツールです。
高度なUIを備えていますが、直感的で使いやすいです。
HTMLおよびCSSファイルも処理します。
これを使用する最良の方法は、すべてのプライベート変数の前にアンダースコアのようなものを付け、次にこのsort
機能を使用してそれらをすべてグループ化し、難読化のターゲットとしてチェックすることです。
ユーザーは、自分のソースを表示することができますが、あなたのプライベート変数は、のようなものから変換されたときには、解読にはるかに困難だ_sUserPreferredNickName
とa
。
エンジンは、ターゲット変数の数を自動的に集計し、最大の圧縮を得るためにそれらに優先順位を付けます。
私はJasobで働いていません。彼らを宣伝しても何も得られません。フレンドリーなアドバイスを提供するだけです。
不利な点は、無料ではなく、少し値段が高いですが、他の選択肢と比較すると価値があります。「無料」のオプションも近づきません。
Javaスクリプトの難読化にClosure-Compilerユーティリティを使用しています。それはコードを最小化し、難読化のためのより多くのオプションがあります。このユーティリティは、次のURLのGoogleコードで入手できます:
クロージャーツール
しかし、今日私はUglifyJSの多くを聞いています。Closure CompilerとUglifyJSの間には、Uglifyが勝者と思われるさまざまな比較があります。
UglifyJS:クロージャーに匹敵するNode.js用の高速な新しいJavaScriptコンプレッサー
すぐに私はUglifyJSにチャンスを与えるでしょう。
JavaScript / HTML / CSS難読化ツール/圧縮プログラムとして、Patu Diguaを試すこともできます。
これはミニファイしますが、難読化しません。コマンドラインJavaを使用したくない場合は、JavaScriptをWebフォームに貼り付けることができます。
間違いなくObfuscriptorを検討することを検討してください。
私は、YUI CompressorやGoogle Closureなどの他のツールから見た典型的なJavascriptの縮小テクニックを超えています。
難読化されたコードは暗号化されたように見えます。私が以前に見たものとは異なり。
JavaScriptライブラリーを使用する場合は、クロージャー・コンパイラーの拡張モードのコンパイルと互換性のある(マイナーな変更後)Dojo Toolkitを検討してください。
Dojo – Closure Compilerと互換性のある唯一のJavaScriptライブラリ
Closure Advancedモードでコンパイルされたコードは、コードベース全体(ライブラリを含む)が難読化されているため、美化機能を通過してもリバースエンジニアリングすることはほとんど不可能です。また、平均で25%小さくなります。
単純化されたJavaScriptコード(YUI Compressor、Uglifyなど)は、美化機能を通過した後のリバースエンジニアリングが簡単です。
私は過去にこれを使ったことがありますが、それはうまくいきます。無料ではありませんが、ぜひご覧ください。
JavaScript難読化およびエンコーダー