2011-12-07 11 views
2

漠然としたタイトルのため申し訳ありません!私は、多くのPDFファイルと制限された毎月の帯域幅を持つウェブサイトを持っています。私が達成したいのは(PHPで)各ユーザ($_SESSION?)を特定の制限(50MBなど)に制限する方法です。それ以上のダウンロードを拒否するWebページにリダイレクトされる別のファイルをダウンロードすると(次の24時間、と言う)。ユーザーがウェブサイトからダウンロードする量を制限し、限界に達したときにリダイレクトしますか?

これは可能ですか?私は私のダウンロード "カウンタ"は、.pdfファイルをカウントすることができない場合(私はvistorsは、制限に達すると、サイトを参照してブロックされたくない)か分からない。どんな擬似コードも非常に高く評価されます。

答えて

4

あなたはあなたのダウンロードのすべてを単一のPHPスクリプトを経由している場合:

<a href="download.php?file='filename.pdf'" /> 

あなたはかなりあなたがやりたいことができます。そのPHPファイルは、すべてのファイルを(ウェブルートから外して)配信し、_SESSIONに書き込むことができ、リダイレクトを実行できます。楽しい。

0

私はおそらくこのためにセッションから離れています。セッションは揮発性で、さまざまなブラウザの動作に影響を受けます。たとえば、Firefoxでセッションが初期化されている場合は、Firefoxを終了して同じサイトにアクセスし、セッションはまだ有効です。しかし、IEで複数のタブを開いて同じサイトにアクセスすると、タブ付きインスタンスごとに新しいセッションIDが取得されます。

ユーザーがサイトにログインする必要があるアカウントシステムを設定することをおすすめします。その後、アカウントレベルでダウンロード量を追跡できます。これは複数のセッション間で維持されます。

2

既にユーザーシステムをお持ちの場合は、すべての情報をユーザープロファイルに保存することをお勧めします。

彼はすべてのクッキーとリロジンを削除しても問題ありません。

ゲスト用には、キャプチャとセッションまたはIPベースの制限をお勧めします。

// Pseudo code 
// download.php 

function UserHasReachedLimit($file) 
{ 
    $info = $Database->QueryUserInfo('limit'); 
    $max = $Database->GetLimitForFile($file); 

    if ($info[$file] > $max) 
    return false; 
    else 
    return true; 
} 

if (IsUser()) 
{ 
    if (UserHasReachedLimit()) 
    error(); 
    else 
    download(); 
} 
else // guest 
{ 
    // session or IP based restrictions... 
} 
+0

感謝を格納するテーブルを作成します。私はユーザーシステムを持っていないし、サイトのスコープ/サイズをいくらか超えているようだが、私はそれを念頭に置くだろう。私はセッション/ IPの制限が(Digital Precisionの警告にもかかわらず)残っていると思います。擬似コードの面で誰かが私にいくつかのアイデアを与えることができますか?私はdownload.phpを考えていますか?file = 'foo.pdf' download.phpはIPをチェックし、SESSIONを再開し、ファイルのサイズを制限と比較してダウンロードを許可/拒否します。しかし、1日後にどのようにセッションをクリアするのですか?残りは賢明ですか? – rwb

0

は、私はあなたが一般的な方法(クッキー、IP ...)と実用的でないと訪問者の帯域幅ごとに追跡しようとしている一方で、あなたのサイトに登録するようにユーザーを強制的に避けるようにしようとしていると思います。だから、私の意見では、もちろん、多くの改善された解決策がありますが、名前、パスワード、電子メールなどの簡単な登録フォームを作成することです。ログインしてファイルをダウンロードしようとすると、次の手順でリクエストを処理します。

1)ファイル名.pdfのユーザー要求(可用性とサイズを確認する(重要))。

2)チェックユーザーの帯域幅:

$query = sql_query("SELECT Bandwidth, LastDownload FROM Users, Stats WHERE USER_ID=5"); 
$result = sql_fetch($query); 
if ($result['Bandwidth'] < 50M) 
showDownloadLink(); 
else if($result['LastDownload'] - currentTime() !=0) 
echo "please wait to the next 24h"; 

データベースは次のようにする必要があります: ユーザー:

ID_U int(key, auto increment), Name varchar(25), email varchar(255), password varchar(32), Bandwith float 

統計:

ID_S int(key, auto increment), LastDownload time, ID_U integer 

注: たびに、ユーザファイルをダウンロードする適切なユーザーの帯域幅行を更新するので、後で特定のユーザーがその制限に達するかどうかを確認できます。 24時間ごとにリセットする必要があります。

これは一般的な解決策であり、カウンタの帯域幅を24Hごとにリセットする必要があるように、多くの人はチェックする必要があると考えています。

0

応答のカウントダウンロード

CREATE TABLE IF NOT EXISTS `downloaded` (
    `ip` varchar(200) NOT NULL, 
    `count` int(11) NOT NULL DEFAULT '0', 
    `last_access` datetime DEFAULT NULL, 
    UNIQUE KEY `ip` (`ip`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

<?php 

/* 
$limit => Number of Downloads Allowed 
$period => In minutes 

*/ 
function UserHasReachedLimit($limit, $period) { 
$ip = addslashes($_SERVER['REMOTE_ADDR']); 
$dl = false; 
$sql = sprintf("SELECT UNIX_TIMESTAMP(last_access) last_time, count FROM downloaded WHERE ip = '%s' ORDER BY last_access DESC", $ip); 
$res = mysql_query($sql); 

if (mysql_num_rows($res) > 0) { // There is a registered IP already 
    $last_xs = mysql_result($res, 0, 'last_time'); 
    $last_xs += $last_xs+$period * 60; 
    $count = mysql_result($res, 0, 'count'); // number of downloads by this ip 
    if ($count == $limit && $last_xs > time()) { // we check if downloads reached in this period 
    $dl = true; 
    } else { 
    $sql = sprintf("UPDATE downloaded SET count = CASE WHEN count >= %s THEN 0 ELSE count+1 END, last_access=now() WHERE ip ='%s'", $limit+1, $ip); // we just update download count + 1 
    mysql_query($sql); 
    } 
    } else { // There is not a registered IP and we create it 
    $sql = sprintf("INSERT INTO downloaded VALUES ('%s', '0', NOW());", $ip); mysql_query($sql); 
    } 
return $dl; 
} 


/* 
Usage 
*/ 
$limit = 2; 
$period = 2; 
if(UserHasReachedLimit($limit, $period) == true) { 
// User reached number of 2 downloads in 2 minutes 

} else { 
// Continue downloading 

} 



?>