web-dev-qa-db-ja.com

JavaScriptコードの難読化

一部のFlash開発者はJavaScriptを恐れています。彼らの視点:

JSソースコードを盗むのは簡単です。「ソースを表示」してコピーするだけです。はい、Flashバイトコードを逆コンパイルできますが、より多くの時間と知識が必要です。その結果、JavaScriptは商用ソフトウェア開発には適していません。競合他社がコードを盗み、元の開発者を廃業させるためです。

商用Webアプリケーションの開発時にJavaScriptコードを難読化することは意味がありますか?

実際に機能する難読化手法はありますか? Googleのような大企業がWebアプリケーションコードを難読化していますか。たとえば、GmailやGoogleドライブはどういうわけか保護されていますか?

17
hidarikani

ここで問題となっている手術の言葉は「恐れている」と思います。嫌悪感は事実ではなく恐怖に基づいています。実際には、脅威モデルは特に現実的ではありません。最近の商用Webソフトウェア開発会社はJavaScriptをほぼ普遍的に使用しており、難読化されているかどうかにかかわらず、競合他社によってJSが盗まれ、そのためにビジネスから追い出された例を1つでも見つけてください。私はそれが起こらなかったと確信しており、おそらくそうでもありません。

2つ目の質問ですが、Googleのような企業はJavaScriptを難読化していますか?はい、ただしセキュリティ上ではありません!ダウンロードサイズを減らしてページの読み込み時間を最小限に抑えるために、コードのサイズを最小限に抑えるために難読化されています。 ( Google Closure Compiler を参照してください。)クライアントに配信する必要のあるバイト数を最小限に抑えることが唯一の目標であるため、これは必ずしもセキュリティを難読化する方法ではありません。これは、誰かがJavaScriptを読めるかどうかを心配することなく、JavaScriptに焦点を当てるべきです。

24
Xander

いいえ。JavaScriptを難読化しても、通常はまったく意味がありません。クライアント側に配置するロジックは、どのように難読化しても、十分に決められた攻撃によって簡単に取得できると常に想定してください。

「重要な」ロジックはサーバー側に保存する必要があります。

9
user10211

難読化は実際の保護ではないことをすでにご存じのようですので、 セキュリティby obscurity については説明しません。

意味があるのはこれです。競合するコードをサーバーに配置して保護し、次にクライアント側のコードを必要なだけ難読化します。確かに、それほどセキュリティは得られませんが、子供が忍び寄るのを確実に阻止し、 セキュリティシアター の一部として、より強力なセキュリティの印象を与えます。 GoogleはGMailを使用して、Facebookはそれを実行しています。

コードは解読されることに注意してくださいビルドプロセスの一部として難読化して、クライアントとユーザーをより幸せにすることができます。

それを実現するために使用できるツールはたくさんあります: 無料のJavascript ObfuscatorJScrambler (商用)は、以前使用した2つのツールです。

更新:The DMZ についての議論の後に、GoogleとFacebookはそうだと結論しましたが、おそらくファイルサイズとパフォーマンスのみであり、セキュリティシアターの一部であることを示唆するものは何もないようです。

7
Adi

もちろん、これは根拠のない恐怖です。

JavaScriptは大規模なエコシステムの一部にすぎませんが、ブランド、サイトの使いやすさ、サイトの整合性、応答性、ネットワーク効果がさらに重要です。

ええ、javascriptの最小化、最適化は良いことですが、これらの目的のためではありません。

競合他社があなたのコードを盗んだ場合、あなたは彼らの尾を合法にして彼らの評判を殺すことができますが、彼らはそんなに愚かになるでしょうか(それは彼らのサイトでも明らかにされています)?

そして、この議論はhtmlと画像にも当てはまる可能性があり、人々はそれを盗むことができるので、あなたは明らかにあなたのウェブサイト全体を破壊する必要があります。

個人的に私は私のxxxxpyコードを隠すために難読化します;)そして、コメントlolを取り出します。

4
Andrew Russell

コードが機能する場合、難読化は役に立ちません。この例を見てみましょう:
難読化前:

_function say(whatever){
alert(whatever);
}
_

後:

_eval(function(p,a,c,k,e,d){e=function(c){return c};if(!''.replace(/^/,String)){while(c--){d[c]=k[c]
||c}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(ne
w RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('1 3(0){2(0)}',4,4,'whatever|function|alert|say'.sp
lit('|'),0,{}))
_

現在、そうした混乱のすべてを実際に理解しようとする人は多くありませんが、それを盗もうとするのであれば、そうする必要はありません。

難読化されたバージョンは、元のバージョンと同じように呼び出すことができます:say("hi")

元のバージョンの呼び出し方法がわからない場合は、アラートを受け取る関数/イベントを見つけ、alertではなくカスタム関数を使用しているかどうかを確認してから、CTRL + Fを使用してこの関数を見つけます。

最後の手段として、単にRegExを解析するだけですが、私の例では、「難読化」のほとんどは、実行時に関数名から実際の名前へのRegEx変換にすぎません。気づいた_'whatever|function|alert|say'_?

1
DividedByZero