2011-08-04 3 views
0

サブスクリプション閲覧サービスを販売しています。一旦人々が支払いを受けると、彼らは彼らに電子メールで送られた一意のURLを得る。リンクは一定の時間が経過した後に期限切れになるように設定されていますが、最初の3つのIPアドレスが著作権侵害を止める前にリンクを使用することを許可したいだけです。私はこのように、何千ものログインを保持しながら別のデータベースを稼働させないようにしています。私はディレクトリに書き込むことができ、リンクのサフィックス(この場合はzFZpj4b2AkEFz%2B3O)にファイル名を持ち、ファイルに最大3つのIPがリストされていると仮定します。アドバンストPHP:最初の3つのIPで一意のURLをクリックできるようにする

それはすべてがこれまでに電子メールで次のようになりますIPアドレスカウントと一意のリンクがなければうまく機能:

<? 
$time = time(); 
include('settings.php'); 
class RC4Crypt { 

     /** 
     * Encrypt the data. 
     * @param string private key. 
     * @param string data to be encrypted. 
     * @return string encrypted string. 
     */ 
     function encrypt ($pwd, $data) 
     { 
       $key[] = ''; 
       $box[] = ''; 

       $pwd_length = strlen($pwd); 
       $data_length = strlen($data); 

       for ($i = 0; $i < 256; $i++) 
       { 
         $key[$i] = ord($pwd[$i % $pwd_length]); 
         $box[$i] = $i; 
       } 

       for ($j = $i = 0; $i < 256; $i++) 
       { 
         $j = ($j + $box[$i] + $key[$i]) % 256; 
         $tmp = $box[$i]; 
         $box[$i] = $box[$j]; 
         $box[$j] = $tmp; 
       } 

       $cipher = ''; 

       for ($a = $j = $i = 0; $i < $data_length; $i++) 
       { 
         $a = ($a + 1) % 256; 
         $j = ($j + $box[$a]) % 256; 

         $tmp = $box[$a]; 
         $box[$a] = $box[$j]; 
         $box[$j] = $tmp; 

         $k = $box[(($box[$a] + $box[$j]) % 256)]; 
         $cipher .= chr(ord($data[$i])^$k); 
       } 
       return ($cipher); 
     } 
     /** 
     * Decrypt the data. 
     * @param string private key. 
     * @param string cipher text (encrypted text). 
     * @return string plain text. 
     */ 
     function decrypt ($pwd, $data) 
     {    
       return RC4Crypt::encrypt($pwd, ($data)); 
     } 
} 

if(!isset($_GET['file']) || empty($_GET['file'])) { 
     echo 'Invalid Request'; 
     return; 
} 

$data = $_GET['file']; 

$id_time = RC4Crypt::decrypt($secret,base64_decode(rawurldecode($data))); 

list($product_id,$timestamp) = explode('|',$id_time); 

if(!isset($products[$product_id])) { 
     echo 'Invalid Request'; 
     return; 
} 

if ($timestamp < $time - ($download_life * 60)) { 
     echo 'Link Expired'; 
     return; 
} 

if(isset($products[$product_id])) { 
print ("<html><head><meta http-equiv=Refresh content=\"0;URL=http://www.blah.com/view/\"></head><body></html>"); 
     return; 
} 
?> 

http://www.blah.com/download.php?file=zFZpj4b2AkEFz%2B3O

ファイルdownload.phpはこのようになります

あまりにも長く過ごしてしまった人には、これまでどんな親切な魂も同情できますか? :) どうもありがとう。

--edit -

思考:どのようなリンクが最初に押されたときにサーバー側のクッキーを保存し、それが存在する場合にアクセスを拒否について3つのIPを忘れますか?

+0

あなたは、いくつかの人間の検証を必要とする、検索エンジンのツールバーやウイルスプログラムのようなものは、自動的にハイパーリンクに従いますし、不必要な印象としてカウントすることができます。 – Dunhamzzz

+0

ありがとうございますが、それは期限付きの固有の電子メールです。 –

答えて

2

これを行うには、サブスクリプションごとにテーブルを作成する必要があります。

table subscription: subId, subCode, subVisitTimes, subVisitedIP

subCode各訪問についてzFZpj4b2AkEFz%2B3O

ようになります、あなたは$_SERVER['REMOTE_ADDR']を使用して、クライアントのIPを取得します。

  1. subVisitedIPに存在する場合は、アクセスを許可します。
  2. それはチェックしsubVisitTimes値は存在しない場合:その後も(あなたがシリアル化を使用する必要がありますsubVisitedIPに、クライアントのIPを追加し、アクセスを許可する

  3. subVisitTimes < 3場合はアクセスを拒否し、1によってその価値を高める

    • subVisitTimes = 3場合3つのIPの配列を格納する関数)。
1

あなたはこのために簡単なデータベースを設定したいと思うでしょう。ハッシュ/ ID、元のIP、期限切れなどの行が1行だけ必要です。アクセスがなくなると、期限切れに設定されます。この方法では、コストのかかるDELETE問合せを実行していないため、スペースを節約するために必要な場合は、月に数回それらの行を一度に削除するだけで済みます。

そうしないと、フラットファイルを使用すると複雑すぎてエラーが発生しやすくなります。

+0

両方の回答ありがとう。私は何をやったのかスクラップしなければならないかもしれないと思う。私は本当にDBを避けるために熱望しています。生成されたリンクのクリック回数を制限する有償PHPスクリプトがありますか?再度、感謝します。 –

+0

考えてみましょう:3つのIPを忘れると、リンクが初めて押されたときにサーバー側のCookieが保存され、存在する場合はアクセスが拒否されます。 –

+0

しかし、私の頭の上から離れていない、私はあなたのために1つを書くつもりです。実際にデータベースを使用していない場合、フラットファイルを扱うのが面倒かもしれませんが、それは可能です。 –

関連する問題