- ベストアンサー
PHPによるシステム(有償)を無断でコピーおよび実行されたくないのですがどうすればいいでしょうか?
PHP4を使いまして、 ある簡単なウェブ上のシステムを作りました。 で、それを不特定多数の多数に有償で設置したいと思っています。 設置作業も私が行うため、設定ファイルなどで書き換えが生じる可能性があります。 動作環境はLinux上限定です。 で、そのシステムを配置するURLは、 (1)「http://www.example.com/」 (2)「http://www.example.com/foo/」 (3)「http://www.example.net/bar/」 (4)「http://www.example.org/bar/hoge/」 のように多数ある訳ですが、ユニークです。 そこで、問題なのですが、 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 前例の(1)、(2)のサイトにのみ設置した状態で、 これらのソースをそのまま(3)や(4)にコピーされて、動くと困ってしまいます。 どうにかうまい策はないでしょうか? ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 「そのシステムを配置するURL」がユニークなので、 「その文字列」と、「マスターパスワード(当然配布しません)」、および、md5を使えば、 いけるようなきがしたのですが、 いまいちロジックが思いつきません。 以下のようなものでは、意味がないですよね? ================================================================================== <?php $str = $_REQUEST['url'] . 'master_password_hogehoge'; print md5($str): exit; ?> というようなスクリプトで、 文字列(仮に、「1f3870be274f6c49b3e31a0c6728957f」とします)を生成しておいて、 各サイトに配布する設定ファイルに、 <?php require_once('1f3870be274f6c49b3e31a0c6728957f' . '.php'); ?> と書く。 ================================================================================== これでは、「1f3870be274f6c49b3e31a0c6728957f.php」をリネームされ、 require_once('1f3870be274f6c49b3e31a0c6728957f' . '.php');の部分も文字列を変更されれば、意味ないですよね? 前述のような、 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ 前例の(1)、(2)のサイトにのみ設置した状態で、 これらのソースをそのまま(3)や(4)にコピーされて、動くと困ってしまいます。 どうにかうまい策はないでしょうか? ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ を実現させるロジックはないものでしょうか? (md5を使わなくてもかまいません。) お助け願えれば幸いです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
参考URLにPHPスクリプトを暗号化しライセンス管理できる製品があります。 高額ですが、業務で使われるのなら考えてみてはいかがでしょうか。
その他の回答 (1)
- taketan_mydns_jp
- ベストアンサー率58% (450/773)
完璧は難しいかもしれませんが、とりあえずホスト情報、スクリプトファイルの位置等の情報を書いておけばある程度いける気がします。 $h = crypt($_SERVER["HTTP_HOST"],$str); $f = crypt($_SERVER["SCRIPT_FILENAME"],$str); としたとき、例えば $h = "abP9I.Amiwiq."; $f = "abm2Wav/Iw9FU"; というキーをスクリプトに書いておいて、それと一致した場合だけ動くようなスクリプトにすれば良いと思います。 まぁ、書き換えられたらどうしようもないですが(笑。 DB接続する場合、暗号化されたキーをDBにに保管しておけば比較的わかりにくくなると思います。いずれにせよ、そのままコピーでは使えないようにはなると思います。 また、キーやキーワードを外部ファイルとして管理者サーバに保管して、アクセス制限をかけておけば(PCブラウザからはアクセスできない等)、かなり分かりにくいかもしれません。 いずれにせよ、ソースを読みこなせば最後は分かってしまうので、これに加えて#1さんの方法のようにzendでコンパイルすればほぼ完璧じゃないかと思います。 コンパイルと言えば、キー部分だけを外部スクリプトとしてC等で作成してコンパイルしてしまえばソースを見ることが出来ないので良いかもしれませんね。 参考まで。
お礼
ありがとうございます。 なお今回はどのphpファイルでも必ずinit.phpというファイルを「require_once」していので >$h = crypt($_SERVER["HTTP_HOST"],$str); >$f = crypt($_SERVER["SCRIPT_FILENAME"],$str); でなく、$h = crypt($_SERVER["HTTP_HOST"],$str);だけでいいと思います。同じホストに複数のシステムを設置することは想定してません。 で >$h = crypt($_SERVER["HTTP_HOST"],$str); >としたとき、例えば、 >$h = "abP9I.Amiwiq."; >というキーをスクリプトに書いておいて、それと一致した場合だけ動くようなスクリプトにすれば良いと思います。 とのことですが「それと一致した場合だけ動くようなスクリプト」という部分の書き方がわかりません。 例を、公式サイトの「crypt関数のページ」から抜粋しますと(http://au2.php.net/manual/ja/function.crypt.php) <?php $password = crypt("My1sTpassword"); // saltを自動的に生成 /* 異なったハッシュアルゴリズムが使用された際の問題を避けるために crypt()の結果全体をパスワード比較用のsaltとして渡す必要があります。 (上記のように標準DESに基づくパスワードハッシュは2文字のsaltを使用します が、MD5に基づくハッシュは12文字のsaltを使用します) */ if (crypt($user_input, $password) == $password) { echo "Password verified!"; } ?> とあるのですがこのロジックが分かりません。 「"My1sTpassword"」の文字列が、私の言う「マスターパスワード(当然配布しません)」ですよね?でもそれをcryptしてさらにそれをsaltとしてcryptたものが、「マスターパスワード(当然配布しません)」と一致した場合、OKとみなす?というのがさっぱり… どうか、お助けくださいませ。 なお、もっとお礼をかきたいのですが、文字数制限に引っかかるので、補足欄に書かせていただきます。
補足
恐縮ですが、この補足欄を使って、お礼(というか質問だらけですが・・・すみません)のつづきを書かさせていただきます。 >また、キーやキーワードを外部ファイルとして管理者サーバに保管して、アクセス制限をかけておけば(PCブラウザからはアクセスできない等)、かなり分かりにくいかもしれません。 言葉足らずですみません。質問中の「マスターパスワード(当然配布しません)」は、管理者サーバに保管するという意味合いでした。すみません。 >コンパイルと言えば、キー部分だけを外部スクリプトとしてC等で作成してコンパイルしてしまえばソースを見ることが出来ないので良いかもしれませんね。 このの「キー部分」というのは、 「キーが合致するかを判断するロジックの数行の部分」で、それを別ファイルにして、「reqire_once("コンパイルされたファイル");」というようにするということでしょうか? 質問ばかりで恐縮ですがお答えいただけましたら、とても幸いです。 どうか、よろしくお願い申し上げます。
お礼
ありがとうございます。さすがzendさんですね。 ちょっと直近のプロジェクトには、高額なため(^ ^;、使えませんが、 後々、必要になる場面があるかと思います。 貴重な情報ありがとうございました。