我有一個PHP搜索引擎,許多人都在使用它。我想要做的是,當有人搜索超過25次,然後給他一個警告,說你已經超過了今天的限制,並且不允許進一步改變。如何限制用戶搜索?
我該怎麼用PHP的mysql?或者使用cookie或會話更好?如果是的話,它會怎麼做?
我有一個PHP搜索引擎,許多人都在使用它。我想要做的是,當有人搜索超過25次,然後給他一個警告,說你已經超過了今天的限制,並且不允許進一步改變。如何限制用戶搜索?
我該怎麼用PHP的mysql?或者使用cookie或會話更好?如果是的話,它會怎麼做?
你可以在MySQL創建表與用戶ID(或任何其他唯一標識信息),表示當前日的日期,以及計數器字段,您可以通過1每次他做了搜索時間增加。然後在啓動搜索之前檢查計數器,如果計數器爲25,則不允許搜索。
使用會話,APC,內存緩存,餅乾等,並不能保證你將能夠容納的極限。
如果使用APC或內存緩存或任何其他系統,設計用於高速緩存,內存限制可能會耗盡你儲存在該密鑰將消失,從而允許用戶25個新的搜索。
如果使用會話,用戶只需註銷並重新登錄,並獲得25次新的搜索。
如果使用cookies,用戶可以簡單地改變或移除瀏覽器的cookie的,從而使新的搜索一次。
永遠不要信任用戶或緩存系統。
session_start();
if (isset($_POST['q'])) { // insert your query parameter instead of 'q'
// Determine if the search counter exists
if (isset($_SESSION['search_counter'])) {
if ($_SESSION['search_counter'] > 25) {
// Rate-limit message here
}
}
else {
// Create a session key to hold the search counter.
$_SESSION['search_counter'] = 0;
}
// Increment the counter after every search.
$_SESSION['search_counter']++;
}
由於您之後立即增加 – 2011-05-24 16:52:26
好點,因此您需要初始化爲0。固定。 – 2011-05-24 16:53:26
如果這些用戶不存儲在服務器端會話的數據記錄是最可靠的辦法,如餅乾可以很容易地清除。但即使這樣也可以繞開。如果它真的是一個大問題 - 讓他們進行身份驗證,然後將這些數據綁定到他們在服務器上的會話和用戶信息,那麼如果它被清除,您可以再次檢查數據庫,然後讓他們執行操作。這會抑制性能,所以你的里程可能會有所不同。
您可以用餅乾做,但是:
因此,所有用戶需要做的是更改瀏覽器,計算機或清除他/她的Cookie,並且他們有一組全新的搜索。
你可以使用一個會話變量做到這一點,但是:
所以,用戶需要做的就是關閉並重新打開瀏覽器,然後他們會有一組新的搜索。
因此,「棘手」的選擇是存儲搜索記錄的增量計數在數據庫中,但是:
儘管如此,這仍然是最好的選擇。
有很多方法可以設計和實現數據庫模式,並且老實說,如何做到這一點將取決於究竟是每天有多少用戶和用戶搜索。
但是,基本算法(不考慮數據庫設計的)是:
爲什麼地球上做你想做的事是什麼? – SLaks 2011-05-24 16:49:19
cookie /會話可以被用戶刪除,所以它會更像是一個軟限制,如果你想安全地保存每個ip的請求數和一個表中的時間戳,並基於該請求採取行動,或者如果沒有這筆交易使用一些非持久性鍵值存儲(如APC)(性能更好) – Hannes 2011-05-24 16:50:10