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


Check If Request Duplicated In Short Interval of Time in PHP

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

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

有什么好方法可以正确做到这一点吗?

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

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

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

此解决方案改用 $_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

这里有几个选项:

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

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