また、ソースコードを閉じたくない場合や、スクリプトがコピーされないようにする方法もあります。 私の意見では、ソースコードを隠すことは、ほとんどの場合、コピー防止なしでは意味がありません。 コードを暗号化する難読化ツールには、特定のドメインまたはIPのスクリプトをブロックする機能があります(単に歪めるものではありません)。 しかし、まず、各ドメインのすべてのソースを再暗号化する必要はありませんか? 次に、スクリプトの最初の1行でこの保護を解除できました。
$ _SERVER ['HTTP_HOST'] = '解決済みドメイン';
私は長い間、コピー防止ソリューションをインターネットで検索しました。 この問題はフォーラムで頻繁に議論され、主に初心者から尋ねられ、経験豊富な(明らかに)プログラマーは「あなたはコードを必要とする愚か者です。ハードウェアを学び、PHPスクリプトは価値がありません!」 まあ、私は思った。 おそらく本当にそうではありません。 ただし、同じBitrix(fu)は個々のサイトのライセンスを発行しますが、ライセンスを購入するとオープンソースコードが取得されます。 それらのサイトのいくつかにそれをコピーすることを妨げるものは何ですか? わかりませんが、知っているなら教えてください。
その結果、私は自分でコピー防止をしなければなりませんでした。 問題の初期条件を設定します。
- スクリプトは、たとえばZendによって明らかに暗号化する必要があります。 しかし、私はLock Itが好きでした。第一に、Zend Optimizerを必要とせず、第二に、安価です。 しかし今では、スクリプトを暗号化する方法ではなく、コピーからスクリプトを保護する方法についてです。 したがって、さらに進んで、ソースコードが閉じていると仮定します。 明らかに、これは必要条件です。
- スクリプトの各インスタンスに対してキーを発行します(ライセンスと呼びます)。 つまり、各ユーザーにライセンスのみを付与し、スクリプトをパブリックドメインに転がしたいのです。
- ライセンスをドメインにバインドしますが、ドメインに同義語がある場合は、それらを介してアクセスしたときにスクリプトが機能するはずです。 主なことは、同じスクリプトインスタンスであることです。
- 別の(私の)サーバーへの接続はありません。 スクリプトは自己完結型である必要があります。
- ライセンス検証中にサーバー変数または環境変数をスクリプトが信頼しません。 それらは簡単に再定義できます。
解決策
1.ライセンスの発行とスクリプトによるライセンスの有効性の検証
次のようにドメインへのキーを作成します。
$ key = md5($ domain。$ secretword);
スクリプトは、次のようにライセンスを確認します。
$ key == md5($ domain。$ secretword);
実際、スクリプトに$ secretwordを保存するのはtoいです。 したがって、ここで公開鍵暗号化を使用できます。 ライセンスを発行するとき、私は秘密鍵で署名し、スクリプトは、ライセンスを確認するときに、公開鍵でライセンスの有効性を確認します。 しかし、標準のPHPバンドルには、RSA(私は盲目ですか?)でさえ、公開鍵暗号化関数は見つかりませんでした。 あなたが助ければ、私は感謝します。
そのため、スクリプトはライセンスが正しいことを確認しました。 つまり、指定されたキーが指定されたドメインと一致するかどうか。 どうぞ
2.ドメインチェック
スクリプトは、指定されたドメインにあるかどうかをどのように確認できますか? $ _SERVER ['HTTP_HOST']には信頼がありません。
また、条件の下で-別のサーバーへの接続なし。 だから、私たちは疑惑のドメインで自分自身に接続し、そこにいるかどうかを確認します:)
むしろ:
1)サーバーに乱数を保存します(たとえば、一時ファイルに保存します)2)our_domain.ru / our_ script.php?アドレスに移動します?Action = say_ number 3)このアドレスに指定された番号を確認します。 保存したものに対応する場合は、アドレスにあります:) 0)ゼロ点は、パラメーターaction = say_numberで呼び出された場合、保存された数値の戻り値を追加することです
アルゴリズムを少し簡略化しました。実際、スクリプトの呼び出しごとに、これらの乱数を個別に考慮する必要があります。
これで、スクリプトは、ライセンスが有効であり、対応するドメインにあることを認識します。 主な問題は解決されました!
あなたは言う-wtf、スクリプトはアクセスされるたびにそれ自体をプルしますか? 確かに、どういうわけか残酷。 したがって:
3.一時ライセンス
最初のアクセスで、チェックが成功した場合、スクリプトは一時ライセンスを一時ファイルに保存します。
一時ライセンスはmd5(今日の日付、ドメイン、秘密の言葉)のようなものです。
現在、すべてのリクエストで、1日有効な一時ライセンスのみを確認しています。 一時ライセンスに何らかの問題(変更、削除、1日が経過)が発生するとすぐに、スクリプトは再びすべてを真剣にチェックし、新しい一時ライセンスを保存します。
4.ライセンスなしでローカルコンピューターでスクリプトを実行する
ローカルコンピューターで実行するときにスクリプトがライセンスを必要としない場合は理想的です。 コンピューターでスクリプトをテストしたいだけなのに、なぜ私からのライセンスが必要なのでしょうか? 彼はそれをダウンロードし、使用しなければなりません。 しかし、彼がスクリプトをサーバーに置くと、彼は私のところに来ます。
この問題を解決する方法がわかりません。 私はこれまでに3つの解決策を持っていますが、私はそれらが好きではありません:
1)スクリプトがドットのないドメイン( myscriptなど)にある場合-これが仮想ドメインであると仮定すると、これはおそらくローカルテストです。 この方法の欠点は、職人がサーバー上に仮想ドメインを作成し、実際のドメインを同義語にすることです。 また、localhostドメインをどうするかは明確ではありません。
2)$ _SERVER ["REMOTE_ADDR"]を確認します。 IPアドレスの先頭に「127」が存在することを確認します。 欠点は、スクリプトを実行する前にこの変数をオーバーライドできることです。
3)おかしいが、サーバーのオペレーティングシステムを確認できます。 Windowsでの実行を許可します。 ただ私をbeatるな、これは単なるオプションです。
テスト用のサンプルスクリプトを投稿します。
建設的なコメントをお待ちしております。 この保護の誤りを見つけるか、新しいアイデアを提出することができます。