在PHP中检查请求是否在短时间间隔内重复

时间:2012-06-27 06:59:37

标签: php search

我有一些基于php程序的案例。我已经实现了一个搜索输入表单来处理搜索需求。有一个控制器处理搜索请求。一旦我意识到请求的动作,它POST或GET可能会导致一个漏洞,允许人们在短时间内重复请求。我想的是要检查最后一个请求并与当前请求进行比较。如果间隔与禁止时间范围匹配(表示它大约为0-500ms),则控制器将不会进行搜索,直到请求超过时间范围。

我打算将请求保存在表上,密钥位于请求者real_IP上。然后将其与新请求(CMIIW)进行比较。

有没有什么好方法可以妥善解决这个问题?

3 个答案:

答案 0 :(得分:2)

使用IP限制搜索次数将导致任何机构(例如:学校)无法使用您的服务/网站/搜索。使用会话限制了对浏览器会话的使用;关闭浏览器将删除会话变量,从而允许新用户使用您的应用程序。

更好的方法是在会话变量中设置上次搜索时间(如您所建议的那样)并检查该变量是否不存在或晚于500毫秒以完成搜索请求。

对于要设置的会话变量,您可以在加载会话$_SESSION['lastsearchtime']后使用session_start()。请注意,session_start可以在已经调用时触发错误。

答案 1 :(得分:2)

此解决方案使用$ _SESSION代替:

session_start();

$now = microtime(true); 
$interval = $now - 2;

if( 
  isset( $_SESSION['last_request'] ) 
  && ($_SESSION['last_request'] >= $interval) 
){   
  exit('timeout'); 
}

$_SESSION['last_request'] = $now;

//do query

答案 2 :(得分:1)

这里有几个选项:

  1. 实现一次性令牌(在wordpress中,称为nonce)。并在每个请求,你检查它。如果令牌已经使用并且再次使用(通过后续请求),则拒绝该请求。

  2. 在会话变量中实现上次请求时间,如果仍在时间窗口内,则检查后面的请求,拒绝该请求。为此,您可以查看 Max Gherkins 的答案。