防止在一段时间内滥用提交内容

时间:2014-09-11 17:20:25

标签: php symfony session cookies throttling

我有一个使用Symfony2框架的php 5.5 web应用程序,并希望将服务器负载保持在最低限度。我网站上的几个页面允许用户从数据库中检索对象列表,一组有几十万行,很快就会超过一百万。未注册的用户可以使用此页面。

我想阻止用户在一分钟或类似的时间内多次执行查询,并且已经在其他网站上看到了这种情况,包括用于评论或投票的stackoverflow。

这是如何实施的?我是否需要创建cookie并检查每个页面加载的会话,以查看是否已使用我要限制的特定操作并阻止表单提交?有没有一种标准的方法来处理这个在PHP,或专门为Symfony2?我搜索过这个并发现了一些类似的问题,但没有具体的答案。这是直接在我的网站上的用户,而不是使用api。

How to throttle API requests using PHP

How do I throttle my site's API users?

编辑:

我知道cookie不是正确的方法,并会尝试使用缓存实现机制。我使用的是PHP 5.5并且读到APC有一些5.5的错误,因此Zend OpCache实际上是优选的APCu。任何人都可以展示使用Zend OpCache / APCu记录和跟踪用户请求的示例吗?

1 个答案:

答案 0 :(得分:1)

Cookie不是安全的方式。当我做了类似的事情时,我使用APC或MongoDB来存储计数器,并使用以下密钥制作:

  • IP:$ _SERVER [' HTTP_X_FORWARDED_FOR'] | $ _SERVER [' REMOTE_ADDR']
  • 浏览器:$ _SERVER [' HTTP_USER_AGENT'])
  • 此时的绝对时间戳(如果您想稍后检查,则为分钟)

因此,例如,您可以存储一个名为的IPC密钥:ip2long($ ip),crc32($ browser),time() - time()%3600,并保存您的命中值。

我提供了一个代码示例,该代码仅在1小时的范围内使用了IP。

// Time
$now = time();
$time = $now - $now%3600;

// IP
if(array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}
$key = sprintf('%d-%u', $time, ip2long($ip));

if (apc_inc($key)) {
    echo "we have ". apc_fetch($key). " views in this hour";
}