我正在編寫一個腳本,這將限制特定用戶從給定IP地址的多個訪問。換句話說,一個給定的用戶只能從同一個IP地址訪問/查看一次該頁面。限制用戶從同一IP訪問多個頁面
但是,如何比較傳入的IP來檢測這種訪問?
我想跟蹤最多60天的IP。
我正在編寫一個腳本,這將限制特定用戶從給定IP地址的多個訪問。換句話說,一個給定的用戶只能從同一個IP地址訪問/查看一次該頁面。限制用戶從同一IP訪問多個頁面
但是,如何比較傳入的IP來檢測這種訪問?
我想跟蹤最多60天的IP。
您需要將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
}
以及您需要的IP地址列表的地方查找反對,所以你可以先用一個表或把它寫入一個文件,然後讀取相應
骨架的答案,但幾乎不值得downvote。 –
我也對downvote感到震驚。我做了什麼錯事? – Satya
第一件事,不同的計算機/用戶可以做共享一個IP地址。你可能會阻止很多人訪問你的網站,只是因爲他們的工作場所有人也訪問過。這就是說,這是我的答案。
您標記爲MySQL
,所以創建一個名爲「ips」的表格 - 或類似的東西。
每當有人訪問你的網站,請檢查自己的IP地址,該表中發現,如果LASTACCESS日期內60天今天。如果是,拒絕或重定向請求。如果他們的IP不在表格中,或者日期距離今天大於60天,請插入/更新表格以包含他們的IP和當前時間,然後允許他們查看請求的頁面。
這不需要在數據庫中完成,您可以在平面文件系統中執行類似的邏輯。但是,您會有很多文件打開,讀取和寫入,這可能有點令人沮喪,因爲您可能試圖寫入文件,因爲您正在嘗試從中讀取文件。
用戶$_SERVER['REMOTE_ADDR']
獲取用戶的IP,但這不是最好的計劃,因爲使用相同代理的多個用戶將作爲一個IP =一個用戶出現在您的服務器上。然後將其存儲在數據庫中。
更好的辦法是在用戶的瀏覽器上設置一個cookie,告訴他們他們已經訪問過。雖然他們可以作弊。但他們也可以通過使用不同的代理來欺騙IP。
這是一個BIG但IPs不是唯一的機器或人的事。那麼邏輯是什麼?
如果你堅持這樣做&沒有數據庫,那麼你可能希望將訪問數據存儲在一個文件中並訪問它來檢查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保存在數據庫中,當用戶進入時進行查找,並根據匹配將他/她重定向到合適的頁面 – Satya
這可以在沒有數據庫的情況下完成嗎? – user1367069