0

ユーザー入力に対してチェックされ、チェックがtrueを返した場合にアプリの使用を許可する、有効なシリアルコードを使用してMySQLデータベースを実装することを考えていましたが、ユーザー(ローカルホストベースを使用する)なので、これはあまりにも基本的すぎることを知っていますアプリケーション)は簡単にデータベースをクラックして自分のシリアルを追加することができます(または、アプリが「魔法の箱」から出てきたと思う場合は、少なくともPHPとSQLの基本を理解している誰かに伝えてください)。

私はこれまでこれを行ったことがないので、人気のあるアプローチはありますか?または、もっと良いのは、あなたが私にいくつかのアイデアを与えてくれたらいいのにと思います。

4

6 に答える 6

1

AFAIKプレーンテキストのPHPソースコードを持っている場合、彼らはあなたが設定した保護を回避することができます。

とは言うものの、コードを難読化(コンパイル?)し、実行のためにコードのロックを解除するために(リモートサーバーからの)キーを必要とするionCube(google it)などのサービスがあります。

または、顧客がアプリケーションに直接アクセスできないように、顧客のソフトウェアをホストすることもできます。

于 2011-09-04T16:52:45.507 に答える
1

ユーザーが自分のサイトに入力したシリアルを送信する「コールホーム」を実装できます。次に、データベースでそのシリアルを確認し、ユーザーが自分のシステムにアクセスできるかどうかに関係なく、適切な応答を送信します。ユーザーが自分のサイトにログインするときにそうすることができます。

これに伴う問題は、Zend Guardなどのツールで暗号化/エンコードされていない場合にphpファイルを変更するのは非常に簡単であるため、ユーザーは呼び出しを行わないように変更することでこれを回避し、常にtrueを返す可能性があることです。または、Webサーバーのhostsファイルを変更して、要求を所有するサーバーに再ルーティングし、チェックを偽って常にtrueを返すファイルをそこに配置することもできます。

これを防ぐには、phpファイルを暗号化すると同時に、チャレンジレスポンスシステムを実装してシリアルをチェックする必要があります。

私があなたの意味を理解していれば。:-P

于 2011-09-04T16:52:59.180 に答える
0

100%クラックできないアプローチは決してありません。時間とノウハウがあれば、何でもリバースエンジニアリングできます。

しかし、クラックされない可能性を最大化するためにできることは、コードを保護するためにZend GuardionCube(およびその他)のようなある種のプリコンパイラー/難読化ツールを使用することです。これらのほとんど(すべて?)には、事前に構築されたライセンス機能が付属しています。これは間違いなく推奨されるアプローチです。

これらの問題は、それらが無料ではないということです...

編集

それについて考えると、非常に選択された一連の状況で、このようなものを自分で安全に実装できます。HipHopバイナリを配布できるものを開発している場合は、自分が何をしているのかをかなり真剣に知らない人によってクラックされることを恐れずに、何かを実装できます。HipHopは、githubから無料でダウンロードできます

ただし、リモートデータベースチェックは依然として悪い考えです。なぜなら、人々はネットワークトラフィックを盗聴してキーをリバースエンジニアリングしたり、応答をスプーフィングする方法を学んだりできるからです(単純なhostsファイルの編集によってネットワークトラフィックが傍受される可能性があります)。各インスタンスのキーをハードコーディングし、呼び出しごとに何らかのアルゴリズムを使用して検証することをお勧めします。このサイトGoogleがここで役立つ場合があります。

于 2011-09-04T16:55:37.820 に答える
0

つまり、ホストにMySALデータベースがあり、顧客アプリがそれに接続しているのですよね?

最初に、データベースと顧客の間にレイヤーを追加します。SOAPなどのhttpリモートインターフェースまたはjsonを使用したもの。

接続(https)を暗号化するか、少なくともチャレンジレスポンスアプローチを使用する必要があります。

しかし、アプリケーションがオープンソースである場合、それを回避する方法は常にあります。そして、そうでなくても;-)。

于 2011-09-04T16:53:27.200 に答える
-2

こちらをご覧ください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;
?>
于 2011-09-04T16:49:01.720 に答える
-2

これは実際にはあなたにとってより良いと思います。こちらをご覧ください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));
?>
于 2011-09-04T16:51:35.340 に答える