我正在编写一个脚本,它将限制特定用户对给定IP地址的多次访问。换句话说,给定用户只能从同一IP地址访问/查看页面一次。
但是如何比较传入的IP来检测这种访问?
我希望最多跟踪IP 60天
答案 0 :(得分:1)
首先,不同的计算机/用户可以共享IP地址。您可以阻止很多人访问您的网站只是因为他们工作场所的某些人也访问过。话虽如此,这是我的答案。
您标记了MySQL
,因此请创建一个名为“ips”的表格 - 或类似的内容。
每当有人访问您的网站时,请检查是否在此表中找到了他们的IP地址,以及lastAccess日期是否在今天的60天内。如果是,请拒绝或重定向请求。如果他们的IP不在表中,或者日期大于60天,则插入/更新表以包含其IP和当前时间,然后允许他们查看请求的页面。
这不需要在数据库中完成,您可以在平面文件系统中执行类似的逻辑。但是,你有很多文件打开,读取,写入,这可能有点令人沮丧,因为你可能试图写入文件,因为你正在尝试从中读取文件。
答案 1 :(得分:1)
您需要将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
}
答案 2 :(得分:1)
如果你坚持这样做&amp;如果没有数据库,那么您可能希望将访问数据存储在文件中并访问它以检查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 */ }
答案 3 :(得分:0)
你需要一个IP列表来查找,所以你可以使用一个表或将它写入一个文件,然后相应地阅读
答案 4 :(得分:0)
用户$_SERVER['REMOTE_ADDR']
获取用户的IP,但这不是最佳计划,因为使用相同代理的多个用户将在您的服务器中显示为一个IP =一个用户。然后将其存储在数据库中。
更好的想法是在用户的浏览器上设置一个cookie,告诉您他们已经访问过。但他们可以作弊。但他们也可以通过使用不同的代理来欺骗IP。
答案 5 :(得分:0)
这是一个很大的但是 - IP并不是机器或人员所独有的。那逻辑是什么?