質問
私は、チェックがtrueを返す場合、アプリのユーザー入力と付与の使用量に対してチェックされる有効なシリアルコードを備えたMySQLデータベースを実装することを考えていましたが、ユーザー(ローカルホストベースを使用する誰が使用するので、これは基本的すぎることを知っていますアプリケーション)は、データベースを簡単にクラックして独自のシリアルを追加できます(または、「マジックボックス」からアプリが出てくると思われる場合は、PHP&SQLの基本的な理解を持っている他の人に伝えます)。
これを行ったことがないので、人気のあるアプローチはありますか?それとも、あなたが私にいくつかのアイデアをくれたらいいと思います。
解決
100%クラッキング不可能なアプローチはありません。 なんでも 時間とノウハウがある場合は、リバースエンジニアリングできます。
しかし、ひびを入れることができない可能性を最大化するためにできること Zend Guard また Ioncube (と その他)あなたのコードを保護します。これらのほとんど(すべて)には、事前に構築されたライセンス機能が付属しています。これは間違いなく推奨されるアプローチです。
これらの問題は、それらが自由ではないということです...
編集
それについて考えて、あなた たぶん......だろう 非常に選択した状況で、安全にこのようなものを自分で実装してください。配布できるものを開発している場合 ヒップホップ のバイナリ、あなたは自分が何をしているのかをかなり真剣に知らない人々によってそれがひび割れられることを恐れることなく何かを実装することができます。 Hiphopは自由です Githubからダウンロードできます.
しかし、リモートデータベースのチェックはまだ悪い考えです。なぜなら、人々はネットワークトラフィックを嗅ぎ、キーをリバースエンジニアリングしたり、応答をスプーフィングする方法を学ぶことができるからです(単純なもの ホストファイル 編集は、ネットワークトラフィックをインターセプトできます)。各インスタンスのキーをハードコーディングし、各アルゴリズムを使用して各インスタンスで検証する方が良いでしょう - このサイト と グーグル ここであなたを助けるかもしれません。
他のヒント
AFAIKは、PHPソースコードをプレーンテキストに持っている場合、あなたが導入した保護を回避することができます。
とはいえ、コードを難読化(コンパイルしますか?)Ioncube(Google IT)などのサービスがあり、実行のためにコードのロックを解除するためにキー(リモートサーバーから)が必要です。
または、顧客がアプリケーションに直接アクセスできないように、顧客向けのソフトウェアをホストすることもできます。
ユーザーがサイトに入力したシリアルを送信する「コールホーム」を実装できます。次に、データベースでそのシリアルを確認し、ユーザーがシステムにアクセスできるかどうかにかかわらず、適切な返信を送信します。ユーザーがサイトにログインしたときにそうすることができます。
これの問題は、Zend Guardのようなツールで暗号化 /エンコードされていない場合、PHPファイルを変更するのは非常に簡単であるため、ユーザーは呼び出しを変更しないように回避し、常に真で返される可能性があることです。または、Webサーバーのホストファイルを変更して、所有しているサーバーにリクエストを再ルーティングし、チェックを偽装し、常に真実を返すファイルを配置することもできます。
これを防ぐには、PHPファイルを暗号化し、チャレンジ応答システムを実装してシリアルを確認する必要があります。
私があなたが何を意味するのか理解しているなら。 :P
ホストにMySalデータベースがあり、カスタマーアプリが接続していますよね?
最初は、データベースと顧客のレイヤーを追加します。 SOAPまたはJSONを使用する何かのようなHTTPリモートインターフェイス。
接続を暗号化(HTTPS)するか、少なくともいくつかのチャレンジ応答アプローチを使用する必要があります。
しかし、アプリケーションがオープンソースである場合、Therは常にそれをバイパスする方法です。そして、それがそうでない場合はven-)。
ここを見てください http://dev.michaelnorris.co.uk/tests/random_string.php
<?php
function makePin($lenth=10) {
// makes a random alpha numeric string of a given lenth
$aZ09 = array_merge(range('A', 'Z'), range('a', 'z'),range(0, 9));
//$aZ09 = array_merge(range('A', 'Z'), range(0, 9));
$out ='';
for($c=0;$c < $lenth;$c++) {
$out .= $aZ09[mt_rand(0,count($aZ09)-1)];
}
return $out;
}
$obscure = makePin();
echo $obscure;
?>
これは実際にはあなたにとってより良いと思います。ここを見てください http://dev.michaelnorris.co.uk/tests/random_password.php
私はこの例をオンラインで他のソースから一緒にマッシュしたので、私は覚えていないが、とにかくここにあるので、私はこの例を信用することはできません。
<?php
// just so we know it is broken
error_reporting(E_ALL);
//string passType can be alpha, numeric, or alphanumeric defaults to alphanumeric int $length is the length of the password, defaults to eight
class randomPassword{
function __construct($passType='alphanumeric', $length=8, $rangeLength=9){
$this->setLength($length);
$this->setRangeLength($rangeLength);
$this->passType = $this->setPassType($passType);
}
function setRangeLength($rangeLength){
$this->rangeLength=$rangeLength;
}
// set the length of the password
private function setLength($length){
$this->length=$length;
}
// set the type of password
private function setPassType($passType){
return $passType.'Chars';
}
// return an array of numbers
private function numericChars(){
return range(0, $this->rangeLength);
}
// return an array of chars
private function alphaChars(){
return range('a', 'z');
}
// return an array of alphanumeric chars
private function alphaNumericChars(){
return array_merge($this->numericChars(), $this->alphaChars());
}
// return a string of chars
private function makeString(){
// here we set the function to call based on the password type
$funcName = $this->passType;
return implode($this->$funcName());
}
// shuffle the chars and return $length of chars
public function makePassword(){
return substr(str_shuffle($this->makeString()), 1, $this->length);
}
} // end class
function randomPassword($length) {
// create an array of chars to use as password
$chars = implode(array_merge(range(0,9), range('a', 'z')));
// randomly snarf $length number of array keys
return substr(str_shuffle($chars), 1, $length);
}
/*
try
{
$obj = new randomPassword('alphanumeric', 16, 100);
echo $obj->makePassword().'<br />';
}
catch(Exception $ex)
{
echo $ex->getMessage();
}
*/
echo strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5)).'-'.strtoupper(randomPassword(5));
?>