特定のIPアドレスからの特定のユーザーの複数のアクセスを制限するスクリプトをコーディングしています。つまり、特定のユーザーは、同じIPアドレスから1回だけページにアクセス/表示できます。
しかし、この種のアクセスを検出するために着信IPを比較するにはどうすればよいですか?
IPを最大60日間追跡したい。
比較のために、データベースまたはフラットファイルのどこかにIPを保存する必要があります。
次のようなMySQLテーブルがあると想像してみましょうvisits
。
`ip` varchar(255) NOT NULL,
`date_created` datetime NOT NULL,
`last_visit` datetime NOT NULL,
`visits` int(255) NOT NULL,
PRIMARY KEY (`ip`)
PHPを使用すると、ユーザーのIPを取得し、データベースでテーブルレコードを作成または更新してから、比較を行うことができます。
<?php
// Get the user's IP
$ip = getenv('REMOTE_ADDR');
// Create a database record, or update if they're been here before
$dblink = mysql_connect( 'localhost', 'username', 'password' );
mysql_select_db( 'database', $dblink );
$rs = mysql_query( "INSERT INTO visits (ip, date_created, last_visit, visits) VALUES( '$ip', NOW(), NOW(), 1 ) ON DUPLICATE KEY UPDATE `last_visit` = NOW(), visits=visits+1 ", $dblink );
// Compare database record for last visit and first visit
$rs = mysql_query( "SELECT visits, DATEDIFF( last_visit, date_created ) as sincelast FROM visits WHERE `ip` = '$ip' ");
$row = mysql_fetch_assoc( $rs );
// If this is their first visit, do one thing, otherwise, do another.
if ( $row['sincelast'] > 59 || $row['visits'] < 2 ) {
// They visited 60+ days ago, or this is their first visit
} else {
// This is not their first visit
}
まず最初に、さまざまなコンピューター/ユーザーがIPアドレスを共有できます。職場の誰かが訪れたという理由だけで、多くの人があなたのサイトを訪れるのを防ぐことができます。そうは言っても、これが私の答えです。
タグMySQL
を付けたので、「ips」というテーブルを作成します。
誰かがあなたのサイトにアクセスするときはいつでも、そのIPアドレスがこのテーブル内にあるかどうか、そしてlastAccessの日付が今日から60日以内であるかどうかを確認してください。そうである場合は、リクエストを拒否またはリダイレクトします。IPがテーブルにない場合、または日付が今日から60日を超える場合は、IPと現在の時刻を含むようにテーブルを挿入/更新してから、要求されたページの表示を許可します。
これはデータベースで実行する必要はありません。フラットファイルシステムで同様のロジックを実行できます。ただし、ファイルを開く、読み取る、書き込むには多くの時間がかかります。現在ファイルから読み取ろうとしているときにファイルに書き込もうとすると、少しイライラする可能性があります。
これを実行し、データベースなしで実行することを主張する場合は、訪問データをファイル内に保存し、それにアクセスしてIPの最初の訪問時間を確認することをお勧めします。もちろん、これは理論的にはデータベースを使用するのとほとんど同じです。
上で提案したことを実行する関数の例:(これは非常にラフで、そのままでは使用できないことに注意してください)
function allowedIP() {
$vFile = 'vfile'; // file to store visitor data
$revisit = 3600*24*60; // not allowed time in seconds
$now = time(); // visit time
$vIP = ip2long( $_SERVER['REMOTE_ADDR'] ); // get the ip and convert to long
$vData = ( file_exists( $vFile ) ) ?
unserialize( file_get_contents( $vFile ) ) : array(); // get the visit data
if( ! isset( $vData[$vIP] ) || $now - $vData[$vIP] > $revisit ) {
// first visit or 60 days passed since the first visit
$vData[$vIP] = $now; // store the visit time
file_put_contents( $vFile, serialize( $vData ) ); // save to file
return true;
}
return false;
}
この関数の使用法は次のようになります。
if( ! allowedIP() ) { /* ip is not allowed, notify the visitor and don't proceed */ }
どこかで検索するIPのリストが必要なので、テーブルを使用するか、ファイルに書き込んでから、それに応じて読み取ることができます。
ユーザー$_SERVER['REMOTE_ADDR']
はユーザーのIPを取得しますが、同じプロキシを使用する複数のユーザーが1つのIP = 1人のユーザーとしてサーバーに表示されるため、これは最善の計画ではありません。次に、それをデータベースに保存します。
より良いアイデアは、ユーザーのブラウザにCookieを設定して、ユーザーがすでにアクセスしたことを通知することです。しかし、彼らはごまかすことができました。ただし、別のプロキシを使用してIPをだますこともできます。
これは大きな問題ですが、IPはマシンや人に固有のものではありません。では、ロジックは何ですか?