77

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

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

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

さて、スクリプトの出所をユーザーから隠すことはできますか、それともスクリプトの内容を隠してWebページで使用することはできますか?

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

4

12 に答える 12

108

簡単な答えで良い質問:あなたはできません

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

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

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

誰かがブラウザでmyJs.jsファイルにアクセスしようとした場合、スクリプトソースへのアクセスを許可されるべきではありません。
たとえば、ページがphpで記述されている場合、include関数を介してスクリプトを含め、ソースを返すのが安全
かどうかをスクリプトに判断させることができ ます。この例では、外部の「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ファイルの内容を見ることができました。

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

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

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

アップデート:

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

于 2011-01-22T12:22:09.483 に答える
14

できる唯一のことは、コードを難読化して読みにくくすることです。何をするにしても、JavaScriptをブラウザで実行する場合は、コードが必要です。

于 2011-01-22T08:14:58.130 に答える
4

私の頭のすぐ上で、あなたはこのようなことをすることができます(あなたができるように聞こえるサーバーサイドスクリプトを作成できるなら):

通常のようにスクリプトをロードする代わりに、AJAXリクエストをPHPページに送信します(何でもかまいません。私はそれを自分で使用します)。PHPにファイルを見つけて(おそらくサーバーの非公開部分にある)、でファイルを開き、内容を文字列としてfile_get_contents返します(読み取り:)。echo

この文字列がJavaScriptに戻ったら、新しいscriptタグを作成し、innerHTML受け取ったばかりのコードを入力して、タグをページに添付します。(これで問題が発生する可能性innerHTMLがあります。必要なものではない可能性がありますが、実験することはできます。)

これを頻繁に行う場合は、スクリプト名のGET変数を受け入れるPHPページを設定して、同じPHPを使用してさまざまなスクリプトを動的に取得できるようにすることもできます。(代わりにPOSTを使用して、他の人が自分のしていることを少しだけ見づらくすることができます。わかりません。)

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

于 2011-01-22T08:17:05.563 に答える
4

Google ClosureCompiler 、YUIコンプレッサーMinify/ Packer / ...などは、JSコードを圧縮/難読化するためのオプションです。しかし、それらのどれもあなたがユーザーからあなたのコードを隠すのを助けることができません。

適切な知識を持っている人なら誰でも、 JSBeautifierなどのツールを使用してコードを簡単にデコード/難読化できます。あなたはそれに名前を付けます。

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

于 2011-01-22T08:37:41.713 に答える
3

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

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

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

于 2011-01-22T08:15:14.177 に答える
3

それを忘れてください、これは実行可能ではありません。

何をしようとしてもうまくいきません。コードを見つけるためにユーザーが行う必要があるのは、firebugのnetタブを調べるか、 fiddlerを使用してどのようなリクエストが行われているかを確認することだけです。

于 2011-01-22T08:17:20.757 に答える
2

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

于 2013-03-26T19:28:10.503 に答える
1

私はここにいる他のすべての人に同意します。クライアントにJSを使用すると、猫は袋から出され、完全に確実な方法はありません。

そうは言っても; 場合によっては、コードを見たい人の邪魔になるためにこれを行います。これがアルゴリズムの仕組みです(大まかに)

  1. サーバーは、3つのハッシュ値とソルト値を作成します。1つは現在のタイムスタンプ用で、他の2つは次の2秒ごとに使用されます。これらの値は、コンマ区切りの文字列としてAjaxを介してクライアントに送信されます。私のPHPモジュールから。場合によっては、ページが形成されたときにこれらの値をHTMLのスクリプトセクションにハードベークし、ハッシュの使用が終了したらそのスクリプトタグを削除できると思います。サーバーはCORSで保護され、通常のSERVER_NAMEなどをすべて実行します。チェック(これはあまり保護されていませんが、少なくともスクリプトキディに対してある程度の抵抗を提供します)。

  2. また、サーバーが、これを実行している認証済みユーザーのクライアントが実際に存在するかどうかを確認する場合も便利です。

  3. 次に、クライアントはajax呼び出しを介して同じ3つのハッシュ値をサーバーに送り返し、必要な実際のJSをフェッチします。サーバーはハッシュを現在のタイムスタンプと照合します...3つの値は、ブラウザーとサーバー間の遅延を考慮して、データが3秒のウィンドウ内に送信されていることを確認します。

  4. サーバーは、ハッシュの1つが正しく一致していることを確認する必要があります。もしそうなら、それは重要なJSをクライアントに送り返します。これは、バックエンドにデータベースを必要としない、単純で大雑把な「1回限りのパスワード」です。

  5. これは、実際のJSコードに到達するための最初のハッシュセットが生成されてから、ハッカーのウィンドウ期間が3秒しかないことを意味します。

  6. クライアントコード全体をIIFE関数内に含めることができるため、クライアント内の変数の一部は、インスペクターコンソールから読み取るのがさらに困難になります。

    これは深い解決策ではありません。決心したハッカーは登録してアカウントを取得し、サーバーに最初の3つのハッシュを生成するように依頼できます。AjaxとCORSを回避するためのトリックを実行することによって。次に、クライアントに2番目の呼び出しを実行させて、実際のコードを取得します。ただし、これは妥当な量の作業です。

さらに、サーバーが使用するソルトがログイン資格情報に基づいている場合。サーバーは、機密性の高いJSを取得しようとしたユーザーを検出できる場合があります(サーバーは、機密性の高いJSが取得された後、ユーザーの動作に関してさらに追加の作業を行う必要があります。たとえば、期待された他のアクティビティを実行しませんでした)

これの古い、大まかなバージョンは、ここでハッカソンのために行われました:http://planwithin.com/demo/tadr.htmlサーバーがあまりにも多くの遅延を検出し、3秒のウィンドウ期間を超えた場合、これは機能しません

于 2019-12-07T08:27:59.423 に答える
0

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

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

ちょうど私の2セント。

于 2013-10-21T19:15:56.640 に答える
0

アプリケーション/JavaScriptのmimeタイプを設定して、PHP、.NET、Java、または使用している任意の言語として実行することもできます。私は過去に動的CSSファイルに対してこれを行いました。

于 2020-05-24T15:14:11.810 に答える
0

私は今がこの質問に答えるのに間違った時期であることを知っていますが、私はただ何かを考えました

私はそれがストレスになるかもしれないことを知っていますが、少なくともそれはまだうまくいくかもしれません

今の秘訣は作成することです多くのサーバー側エンコーディングスクリプトは、デコード可能である必要があります(たとえば、すべての母音を数字に置き換え、すべての子音に文字「a」を追加して、単語「bat」がba1taになるスクリプト)。次に、次のようなスクリプトを作成します。エンコーディングスクリプト間でランダム化し、使用されているエンコーディングスクリプトの名前でCookieを作成します(クイックヒント:たとえば、Cookieの名前が「encoding_script_being_used」でランダム化スクリプトの場合、Cookieにエンコーディングスクリプトの実際の名前を使用しないようにしてくださいMD10という名前のエンコーディングスクリプトを選択し、Cookieの値としてMD10を使用しないようにしますが、推測を防ぐために「encoding_script4567656」を使用します)次に、Cookieが作成された後、別のスクリプトが「encoding_script_being_used」という名前のCookieをチェックし、値を取得します。次に、使用されているエンコーディングスクリプトを決定します。

エンコーディングスクリプト間でランダム化する理由は、サーバー側言語がjavascript.jsのデコードに使用するスクリプトをランダム化し、セッションまたはCookieを作成して、どのエンコーディングスクリプトが使用されたかを知るためです。その後、サーバー側言語もjavascript.jsをCookieとして配置します






ここで、例を挙げて要約し

ます。PHPは、エンコードスクリプトのリスト間でランダム化し、javascript.jsを暗号化します。次に、使用されたエンコードスクリプトをクライアント側の言語に通知するCookieを作成し、クライアント側の言語がjavascript.js cookieをデコードします(これは明らかにエンコード)

だから人々はあなたのコードを盗むことができません

しかし、私はこれをアドバイスしません

  1. それは長いプロセスです
  2. ストレスが多すぎる
于 2020-07-16T20:13:53.517 に答える
-1

nwjsを使用すると、binにコンパイルして、win、mac、およびlinuxアプリケーションを作成するのに役立つと思います。

于 2022-01-30T07:04:34.920 に答える