我有一个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