2012-05-01 33 views
0

我正在編寫一個腳本,這將限制特定用戶從給定IP地址的多個訪問。換句話說,一個給定的用戶只能從同一個IP地址訪問/查看一次該頁面。限制用戶從同一IP訪問多個頁面

但是,如何比較傳入的IP來檢測這種訪問?

我想跟蹤最多60天的IP。

+0

將IP保存在數據庫中,當用戶進入時進行查找,並根據匹配將他/她重定向到合適的頁面 – Satya

+0

這可以在沒有數據庫的情況下完成嗎? – user1367069

回答

1

您需要將IPs存儲在某個數據庫或平面文件中進行比較。

讓我們想象一下,你有一個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 
} 
0

以及您需要的IP地址列表的地方查找反對,所以你可以先用一個表或把它寫入一個文件,然後讀取相應

+0

骨架的答案,但幾乎不值得downvote。 –

+0

我也對downvote感到震驚。我做了什麼錯事? – Satya

1

第一件事,不同的計算機/用戶可以做共享一個IP地址。你可能會阻止很多人訪問你的網站,只是因爲他們的工作場所有人也訪問過。這就是說,這是我的答案。

您標記爲MySQL,所以創建一個名爲「ips」的表格 - 或類似的東西。

  • ID
  • IP
  • LASTACCESS

每當有人訪問你的網站,請檢查自己的IP地址,該表中發現,如果LASTACCESS日期內60天今天。如果是,拒絕或重定向請求。如果他們的IP不在表格中,或者日期距離今天大於60天,請插入/更新表格以包含他們的IP和當前時間,然後允許他們查看請求的頁面。

這不需要在數據庫中完成,您可以在平面文件系統中執行類似的邏輯。但是,您會有很多文件打開,讀取和寫入,這可能有點令人沮喪,因爲您可能試圖寫入文件,因爲您正在嘗試從中讀取文件。

0

用戶$_SERVER['REMOTE_ADDR']獲取用戶的IP,但這不是最好的計劃,因爲使用相同代理的多個用戶將作爲一個IP =一個用戶出現在您的服務器上。然後將其存儲在數據庫中。

更好的辦法是在用戶的瀏覽器上設置一個cookie,告訴他們他們已經訪問過。雖然他們可以作弊。但他們也可以通過使用不同的代理來欺騙IP。

0

這是一個BIG但IPs不是唯一的機器或人的事。那麼邏輯是什麼?

1

如果你堅持這樣做&沒有數據庫,那麼你可能希望將訪問數據存儲在一個文件中並訪問它來檢查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 */ } 
相關問題