1. ホーム
  2. javascript

javascriptファイルを保護するにはどうしたらいいですか?

2023-09-17 10:17:33

質問

ソースコードを隠すことは不可能だと思いますが、たとえば、私のCDNからJavaScriptファイルをWebページにリンクする必要があり、このスクリプトの場所や内容を知られたくない場合、これは可能でしょうか。

例えば、ウェブサイトからスクリプトをリンクするために、我々は使用します。

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

さて、スクリプトがどこから来たのかをユーザーから隠したり、スクリプトの内容を隠したり、それでもなおウェブページで使用することは可能でしょうか?

たとえば、ファイルにアクセスするためにパスワードを必要とする私のプライベート CDN にそれを保存することによって、それは動作しますか? そうでない場合、私が望むものを得るために何が有効でしょうか?

どのように解決するのですか?

簡単な答えのある良い質問です。 あなたがすることはできません !

Javascript はクライアントサイドのプログラミング言語であり、クライアントのマシン上で動作するため、実際にはクライアントから何かを隠すことはできません。

コードを難読化することは良い解決策ですが、それだけでは不十分です。なぜなら、困難ではありますが、誰かがあなたのコードを解読して、あなたのスクリプトを盗むことができるからです。

あなたのコードを盗まれにくくする方法はいくつかありますが、私が言ったように、何もかもが完璧というわけではありません。

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

<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ファイルの中身を見ることができるようになりました。

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

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

これらはすべて簡単なハックで、あなたの JavaScript コードを完全に保護することはできませんが、あなたのコードを盗もうとしている人を怒らせることができます。

更新しました。

最近、私は 非常に興味深い記事 によって書かれた パトリック・ワイド で、彼はソースコードを画像にエンコードするという別のアプローチを明らかにしました。もちろん、これも確実な方法ではありませんが、もうひとつの フェンス を構築することができます。

このアプローチの背後にある考え方は、ほとんどのブラウザが画像のピクセル操作を行うために canvas 要素を使用できることです。また、canvas のピクセルは 4 つの値(rgba)で表されるため、各ピクセルは 0 ~ 255 の範囲の値を持つことができます。つまり、各ピクセルに文字(実際にはアスキーコード)を格納することができます。残りのエンコード/デコードは些細なことです。

ありがとう、パトリック!