web-dev-qa-db-ja.com

JavaScriptコードを非表示または暗号化するにはどうすればよいですか?

JavaScriptコードを非表示または暗号化して、ユーザーが独自のプログラムを表示、コピー、および/または変更できないようにする方法はありますか?

52
jasonGreen

難読化できますが、完全に保護する方法はありません。

難読化ツールの例: https://obfuscator.io

70
Sev

Javascript暗号化は 悪い考え であることに誰もが同意するでしょうが、攻​​撃を遅くすることが何よりも優れているいくつかの小さなユースケースがあります。 YUI Compressor (@Ben Alpert)が言ったように、またはJSMin、Uglify、またはそれ以上で開始できます。

しかし、私が本当に「ものを隠す」ことを望んでいる主なケースは、私がメールアドレスを公開しているときです。 「= inspect element」をクリックすると、Chromeの問題があります。毎回、元のコードが表示されます。 。

そのメモでは、純粋にスパムボットの速度を落とすために、2つの攻撃を行っています。 I jsを難読化/最小化し、エンコーダーで再度実行します(この場合も、この2番目の手順はクロムではまったく意味がありません)。

純粋なJavascriptエンコーダーではありませんが、私が見つけた最高のhtmlエンコーダーは http://hivelogic.com/enkoder/ です。これは次のようになります:

<script type="text/javascript">
//<![CDATA[
<!--
var c=function(e) { var m="mail" + "to:webmaster";var a="somedomain"; e.href = m+"@"+a+".com";  
};
//-->
//]]>
</script>
<a href="#" onclick="return c(this);"><img src="images/email.png" /></a>

これに:

<script type="text/javascript">
//<![CDATA[
<!--
var x="function f(x){var i,o=\"\",ol=x.length,l=ol;while(x.charCodeAt(l/13)!" +
"=50){try{x+=x;l+=l;}catch(e){}}for(i=l-1;i>=0;i--){o+=x.charAt(i);}return o" +
".substr(0,ol);}f(\")87,\\\"meozp?410\\\\=220\\\\s-dvwggd130\\\\#-2o,V_PY420" +
"\\\\I\\\\\\\\_V[\\\\\\\\620\\\\o710\\\\RB\\\\\\\\610\\\\JAB620\\\\720\\\\n\\"+
"\\{530\\\\410\\\\WJJU010\\\\|>snnn|j5J(771\\\\p{}saa-.W)+T:``vk\\\"\\\\`<02" +
"0\\\\!610\\\\'Dr\\\\010\\\\630\\\\400\\\\620\\\\700\\\\\\\\\\\\N730\\\\,530" +
"\\\\2S16EF600\\\\;420\\\\9ZNONO1200\\\\/000\\\\`'7400\\\\%n\\\\!010\\\\hpr\\"+
"\\= -cn720\\\\a(ce230\\\\500\\\\f730\\\\i,`200\\\\630\\\\[YIR720\\\\]720\\\\"+
"r\\\\720\\\\h][P]@JHADY310\\\\t230\\\\G500\\\\VBT230\\\\200\\\\Clxhh{tzra/{" +
"g0M0$./Pgche%Z8i#p`v^600\\\\\\\\\\\\R730\\\\Q620\\\\030\\\\730\\\\100\\\\72" +
"0\\\\530\\\\700\\\\720\\\\M410\\\\N730\\\\r\\\\530\\\\400\\\\4420\\\\8OM771" +
"\\\\`4400\\\\$010\\\\t\\\\120\\\\230\\\\r\\\\610\\\\310\\\\530\\\\e~o120\\\\"+
"RfJjn\\\\020\\\\lZ\\\\\\\\CZEWCV771\\\\v5lnqf2R1ox771\\\\p\\\"\\\\tr\\\\220" +
"\\\\310\\\\420\\\\600\\\\OSG300\\\\700\\\\410\\\\320\\\\410\\\\120\\\\620\\" +
"\\q)5<: 0>+\\\"(f};o nruter};))++y(^)i(tAedoCrahc.x(edoCrahCmorf.gnirtS=+o;" +
"721=%y;++y)87<i(fi{)++i;l<i;0=i(rof;htgnel.x=l,\\\"\\\"=o,i rav{)y,x(f noit" +
"cnuf\")"                                                                     ;
while(x=eval(x));
//-->
//]]>
</script>

おそらく、いくつかのスパムボットの速度を落とすだけで十分でしょう。これを使ってスパムを送信したことはありません(まだ)。

6
cmroanirgo

いいえ、できません。クライアントブラウザで実行する場合は、クライアントブラウザでダウンロードする必要があります。 Fiddlerを使用してHTTPセッションを検査し、ダウンロードしたjsファイルを取得するのは簡単です。

使用できるトリックがあります。最も明らかなのは、javascript難読化ツールを使用することです。

この場合も、難読化は偶然のs索を防止するだけであり、人々がコードを持ち上げて使用することを防止しません。

フラッシュムービーの形式でコンパイルされたアクションスクリプトを試すことができます。

6
Alan

最高のコンプレッサーの1つ(具体的には難読化ツールではありません)は YUI Compressor です。

5
Sophie Alpert

JavaScriptはスクリプト言語であるため、JavaScriptランタイムによって解釈および実行されるまで、人間が読める形式のままです。

少なくとも技術的な知識のない人からは部分的に隠す唯一の方法は、難読化することです。

難読化は人間が読むのを難しくしますが、技術的に精通している人にとっては不可能ではありません。

3
BakerTheHacker

独自のアルゴリズムなど、特に隠したいものがある場合は、それをサーバーに置くか、Flashムービーに入れてJavaScriptで呼び出します。 ActionScriptの記述はJavaScriptの記述に非常に似ており、JavaScriptとActionScriptの間で通信できます。 Silverlightでも同じことができますが、SilverlightにはFlashのような浸透性はありません。

ただし、携帯電話はJavaScriptを実行できますが、SilverlightまたはFlashは実行できないため、FlashまたはSilverlightを使用するとモバイルユーザーに障害が発生することに注意してください。

3
Nosredna

コードを保護する唯一の安全な方法は、コードを公開しないことです。クライアントの展開では、クライアントがコードにアクセスすることを避けることはできません。

簡単な答えはこうです:できない

長い答えは、フラッシュまたはSilverlightを検討することです。 Silverlightは、クライアント上で実行されているリフレクターの秘密を喜んで提供すると信じています。

フラッシュプラットフォームに類似したものが存在するかどうかはわかりません。

2
Andrew Harry