web-dev-qa-db-ja.com

javascriptファイルを保護するにはどうすればよいですか?

ソースコードを非表示にすることは不可能ですが、たとえば、CDNのJavaScriptファイルをWebページにリンクする必要があり、このスクリプトの場所やコンテンツをユーザーに知られたくない場合は、これが可能?

たとえば、Webサイトからスクリプトをリンクするには、次を使用します。

<script type="text/javascript" src="http://somedomain.com/scriptxyz.js">
</script>

今、スクリプトがどこから来たのかをユーザーから隠すことができますか、それともスクリプトコンテンツを隠してウェブページでそれを使用することは可能ですか?

たとえば、ファイルにアクセスするためにパスワードが必要なプライベートCDNに保存すると、機能しますか?そうでない場合、私が欲しいものを得るために何が機能しますか?

63
Jmlevick

簡単な答えの良い質問:できません

Javascriptはクライアント側のプログラミング言語であるため、クライアントのマシン上で動作するため、クライアントから実際に何かを隠すことはできません。
コードを難読化することは良い解決策ですが、それは十分ではありません。なぜなら、それは難しいですが、誰かがあなたのコードを解読してスクリプトを「盗む」可能性があるからです。
コードを盗まれにくくする方法はいくつかありますが、私が言ったように、何も防弾ではありません。

私の頭の中では、1つのアイデアは、コードを埋め込んだページの外部から外部jsファイルへのアクセスを制限することです。その場合、

<script type="text/javascript" src="myJs.js"></script>

誰かがブラウザでmyJs.jsファイルにアクセスしようとすると、スクリプトソースへのアクセスは許可されません。
たとえば、ページがphpで記述されている場合、include関数を使用してスクリプトを含め、スクリプトにsafeかどうかを判断させることができます"ソースを返します。
この例では、外部 "js"(phpで記述)ファイルmyJs.phpが必要です。

<?php
    $URL = $_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'];
    if ($URL != "my-domain.com/my-page.php")
    die("/\*sry, no acces rights\*/");
?>
// your obfuscated script goes here

それはあなたのメインページmy-page.phpに含まれます:

<script type="text/javascript">
    <?php include "myJs.php"; ?>;
</script> 

この方法では、ブラウザのみがjsファイルの内容を見ることができます。

別の興味深いアイデアは、スクリプトの最後で、domスクリプト要素のコンテンツを削除し、ブラウザーがコードを評価した後、コードが消えるようにすることです。

<script id="erasable" type="text/javascript">
    //your code goes here
    document.getElementById('erasable').innerHTML = "";
</script>

これらはすべて単純なハックであり、これを十分に強調することはできません。jsコードを完全に保護することはできませんが、コードを「盗む」ことを試みる人を怒らせることはできます。

更新:

私は最近出会いました 非常に興味深い記事Patrick Weid によって書かれたjsコードを隠す方法について、彼は別のアプローチを明らかにしています:ソースコードを画像にエンコードすることができます!確かに、それは防弾ではありませんが、コードの周りに構築できる別のフェンスです。
このアプローチの背後にある考え方は、ほとんどのブラウザがキャンバス要素を使用して画像のピクセル操作を行うことができるということです。また、キャンバスピクセルは4つの値(rgba)で表されるため、各ピクセルは0〜255の範囲の値を持つことができます。つまり、すべてのピクセルに文字(実際はASCIIコード)を保存できるということです。残りのエンコード/デコードは簡単です。
ありがとう、パトリック!

91
gion_13

できることは、 obfuscate コードを読みにくくすることだけです。何をするにしても、ブラウザでJavaScriptを実行する場合は、コードが必要になります。

13
GWW

これを読む 。ソースの表示とfirebugなどのデバッグツールの両方でコードを非表示にする非常に良い方法があります。

6
Lee

私の知る限り、これは不可能です。

ブラウザを実行するには、JSファイルにアクセスできる必要があります。ブラウザーにアクセス権がある場合、ブラウザーのユーザーにもアクセス権があります。

JSファイルをパスワードで保護すると、ブラウザーはそれらのファイルにアクセスできなくなり、そもそもJSを使用するという目的に反します。

3
darioo

私の頭の一番上から、次のようなことができます(サーバー側のスクリプトを作成できれば、それができるように聞こえます)。

通常のようにスクリプトをロードする代わりに、AJAXリクエストをPHPページに送信します(何でも構いません。自分で使用します)。 PHPサーバーの非公開部分にある可能性があります)ファイルを見つけ、file_get_contentsでファイルを開き、コンテンツをとして返します(読み取り:echo)文字列。

この文字列がJavaScriptに戻ったら、新しいscriptタグを作成し、そのinnerHTMLに受け取ったコードを追加して、タグをページに添付します。 (あなたはmightに問題があります; innerHTMLは必要なものではないかもしれませんが、試してみてください。)

これを頻繁に行う場合は、同じPHPを使用して異なるスクリプトを動的に取得できるように、スクリプト名のGET変数を受け入れるPHPページをセットアップすることもできます。代わりにPOSTを使用して、他の人があなたのしていることを見るのを少し難しくすることができます。わかりません。)

編集:スクリプトのlocationのみを隠そうとしていると思いました。スクリプト自体を非表示にしようとしている場合、これは明らかにあまり役に立ちません。

3
sdleihssirhc

忘れてください、これはできません。

何を試しても、動作しません。コードを発見するためにユーザーが行う必要があるのは、 firebug のネットタブを調べるか、 fiddler を使用してどのリクエストが行われているかを確認することです。

3

Google Closure CompilerYUIコンプレッサーMinify/ Packer / ...などは、圧縮/ JSコードを難読化する。ただし、ユーザーからコードを隠すことはできません。

適切な知識を持つ人なら誰でも JS Beautifier などのツールを使用してコードを簡単に解読/難読化できます。名前を付けます。

答えは、コードの読み取り/デコードをいつでも難しくすることができますが、非表示にする方法がないことは確かです。

3
Lionel Chan

唯一の方法は、必要なデータをサーバーに配置し、ログインしたユーザーのみが必要に応じてデータにアクセスできるようにすることだと思います(サーバー側で計算を行うこともできます)。これはあなたのjavascriptコードを保護しませんが、サーバーサイドコードなしでは操作不能にします

2
ejectamenta

前にgion_13の回答に残したコメントで述べたように(読んでください)、あなたは本当にできません。 JavaScriptではありません。

コードをクライアント側で利用できるようにしたくない場合(=多大な努力なしで盗むことができる)、私の提案はPHP(ASP、Python、Perl、Ruby、JSP +サーバー側で処理され、計算/コード実行の結果のみがユーザーに提供されます。または、必要に応じて、クライアント側の計算/コード実行を可能にするFlashまたはJavaアプレットでさえもコンパイルされているため、リバースエンジニアリングが困難です(したがって不可能ではありません)。

ちょうど私の2セント。

0
danicotra