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

时间:2013-01-27 14:13:02

标签: php mysql apache security

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

对于像用户登录这样的进程,我会在数据库中保留IP地址,尝试计数和最后一次尝试时间,因此如果有人在最​​后n分钟或几秒钟内尝试超过x次,我只会阻止IP地址。

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

我考虑过使用CAPTCHA但是每个表单使用它会杀死用户体验。在n分钟的x请求之后使用它仍然需要我提到的第一种技术。

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

除了@ 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);