ユーザーは、script.php?userid=222
のようなURLを介して番号でファイルを要求します。この例では、ファイル#222のレコードが表示されます。1分以内に行われるユーザー要求の数を制限する方法
ここでは、(リモートIP)ユーザーあたりのファイル数を1分間に最大5つの異なるレコードに制限したいと考えています。ただし、ユーザーは同じIDレコードに何回もアクセスできなければなりません。
したがって、ユーザーは任意の回数だけファイル#222にアクセスできますが、(リモートIP)ユーザーが1分以内に5つ以上の異なるレコードにアクセスすると、エラーが表示されるはずです。例えば
は、分以内とし、次の要求が行われます。
script.php?userid=222
script.php?userid=523
script.php?userid=665
script.php?userid=852
script.php?userid=132
script.php?userid=002
は、最後の要求に応じて、エラーメッセージが表示されるはずです。ここで
は、基本的なコードです:
$id = $_GET['userid'];
if (!isset($_GET['userid']) || empty($_GET['userid'])) {
echo "Please enter the userid";
die();
}
if (file_exists($userid.".txt") &&
(filemtime($userid.".txt") > (time() - 3600 * $ttime))) {
$ffile = file_get_contents($userid.".txt");} else {
$dcurl = curl_init();
$ffile = fopen($userid.".txt", "w+");
curl_setopt($dcurl, CURLOPT_URL,"http://remoteserver.com/data/$userid");
curl_setopt($dcurl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($dcurl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($dcurl, CURLOPT_TIMEOUT, 50);
curl_setopt($dcurl, CURLOPT_FILE, $ffile);
$ffile = curl_exec($dcurl);
if(curl_errno($dcurl)) // check for execution errors
{
echo 'Script error: ' . curl_error($dcurl);
exit;
}
curl_close($dcurl);
$ffile = file_get_contents($userid.".txt");
}
最も信頼できる方法は、どこかのIPアドレスを保存することですか:あなたはユーザーID引数の有無をチェックして、ファイルの内容を検索する前に、右後にそれを配置する必要がありますデータベース)と、アクセスされたファイルIDおよび日時フィールドとを含んでいる。しかし、これはかなりのサーバートラフィックを生成し、多くのユーザーがいる場合はmysqlサーバーに負荷がかかるでしょう。タイムアウトのあるクッキーやセッションは、リソースが大幅に少なくなります。しかし、彼らはまた、簡単に回避することができます。 (クッキーを削除するかブラウザを閉じてセッションを破棄する)。まず、信頼性とスケーラビリティのどちらかを選択する必要があります。 – icecub
最近ではIPアドレスを本当に信頼できないので、ここでは最も信頼性が高いと言っています。 * Tor *のようなブラウザは、ボタンを押すだけで5秒以内に新しいIPアドレスを与えることができます。だから私はそれが本当にトラブルの価値があるかどうかを調べるだろうか? – icecub