【问题标题】:Prevent abusive submissions within time period防止在时间段内滥用提交
【发布时间】:2014-09-11 17:20:25
【问题描述】:

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

我想防止用户在一分钟内或类似的时间跨度内执行太多次查询,并且已经在其他网站上看到了这一点,包括用于 cmets 或投票的 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 记录和跟踪用户请求的示例?

【问题讨论】:

  • Cookies 驻留在客户端。我需要做的就是禁用它们,然后我可以向你发送所有我想要的垃圾邮件(而且许多机器人不处理 cookie)
  • 是的,我很担心这一点,需要更强大的解决方案
  • 这个答案好的话你能认可吗?
  • 感谢扩展答案。我会将其标记为正确,但仍需再等一天,以防其他人回复。

标签: php symfony session cookies throttling


【解决方案1】:

Cookies 不是安全的方式。当我做类似的事情时,我使用 APC 或 MongoDB 来存储计数器,使用的密钥是:

  • IP:$_SERVER['HTTP_X_FORWARDED_FOR'] | $_SERVER['REMOTE_ADDR']
  • 浏览器:$_SERVER['HTTP_USER_AGENT'])
  • 这一小时的绝对时间戳(或分钟,如果您想稍后查看)

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

我放了一个仅使用 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";
}

【讨论】:

  • 我正在使用 postgresql 并希望使用 APC。这是一个非常小的内存量,但是多大的用户群会使它变得如此之大,以至于我应该将它转移到数据库中?我应该手动清除它还是让缓存自行管理?
  • 这取决于你想要维护你的日志多长时间,如果只有一分钟你不需要这个持久化
  • 你知道这些相同的功能是否可以使用 APCu 工作吗?我能找到的关于 APCu 的文档很少。
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 2013-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多