3

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

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

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

4

3 回答 3

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
于 2012-06-27T07:13:35.327 回答
2

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

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

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

于 2012-06-27T07:07:00.767 回答
1

您在这里有几个选择:

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

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

于 2012-06-27T07:16:01.683 回答