如何在 Web 应用程序中停止太多请求


How to stop too many requests in web applications?

我正在寻找Apache网络服务器的替代安全注意事项。我通常使用PHP和MySQL。

对于用户登录等过程,我会在数据库中保留 IP 地址、尝试计数和上次尝试时间,因此如果有人在最近 n 分钟或秒内尝试超过 x 次,我只需阻止 IP 地址。

当有很多不同的过程(如用户登录)时,将IP地址保留在数据库中听起来不对(因为性能下降和很多事情要做)。我知道如果你想要安全性,你需要牺牲一些性能,但是有没有更好的方法来阻止用户发出太多请求?也许是 Apache 的模块?还是对服务器的较低级别的警告?我特别试图避免不必要的数据库工作。

我考虑过使用CAPTCHA,但将其用于每种表单都会扼杀用户体验。并且在 n 分钟内的 x 请求后使用它仍然需要我提到的第一个技术。

缓存系统可能会有所帮助,但我看不出它如何防止暴力攻击或用垃圾填满数据库。AFAIK 它只有助于从数据库中读取(如果我错了,请纠正我)。

除了上面@ranty的评论(除非你真的同时有很多用户,否则这是合适的),你可以使用内存缓存系统,如memcached。它有一个很好的php界面,非常易于使用。

将每次登录尝试转储到 memcache(使用 IP 地址作为键,trycount 作为值,按时间跨度清除)。它速度很快,不应在性能或开发工作方面花费太多。

此伪代码如下所示:

$memcache_obj = memcache_connect('memcache_host', 11211);
$ip = $_SERVER('REMOTE_ADDR');
$trycount = memcache_get($memcache_obj, $ip);
if ( $trycount == null ) $trycount=0;
if ( $trycount > 3 ) die('bad user');
memcache_set($memcache_obj, $ip, $trycount++ , 0, 30);

您应该尝试CloudFlare,保护您的网站免受各种机器人/黑客的侵害。请记住,stackoverflow 用于有关编程的问题,而不是有关安全问题或托管问题的问题。