Php+MySql 应用程序的响应缓慢


Slow response of a Php+MySql application

我正在使用mysql + php运行一个聊天室(phpfreechat)。我有一个专用服务器来运行此脚本,因为它会消耗大量资源。它适用于 100 个并发用户。但是,最近一位用户威胁我们要杀死这个聊天室,他成功地做到了这个:(

只有40个用户,聊天室已经死了。传递一条消息需要 10-20 秒。MySql 消耗了 300% 的 CPU。但是,对于 100 个用户(当它没有受到攻击时),聊天室仅使用 200-300% 的 CPU。我检查了以下事项,以确保他没有在我们的服务器上进行DoSing/DDoS操作。

1 - Limited 3 requests per seconds.
2 - Analyzed access.log to see any weird activity or CRLF slow attacks. There is none.
3 - Looked per IP connections using netstat command and none has lots of connections. 
4 - I disabled ping of death

服务器上的静态网站即使在攻击下也能正常工作。我假设他通过发送许多请求通过聊天室利用mysql。我运行了以下查询以查看当前与 mysql 的连接:

SHOW STATUS WHERE `variable_name` = 'Threads_connected'

结果只有 7 看起来很正常。我是否可以执行任何其他步骤来阻止他的攻击并保护我的服务器(聊天室)?

(来自最后一条评论)啊,这意味着攻击者正在使用MySQL注入尝试一些查询,所以首先你必须

1) 清理您的输入

如果您使用的是 pdo 或 mysqli,请使用绑定参数(预准备语句)功能来过滤您的输入

或至少mysqliescapestring输入

如果你的PHP页面采用这样的值,.../page.php?id=10那么检查该值并确保它只是整数,如下所示

if(is_numeric($_GET['id'])){ //do operations...}else { //suspicious input given by someone so exit}

2) 限制查询执行时间

由于您有长时间运行的查询(由黑客提供),因此限制查询执行时间,使用语句超时,wait_timeout功能,以便查询具有有限的执行时间

正如我之前在您的 apache 访问日志中所说,您会发现这些睡眠查询作为 GET 参数,因此,找到它并阻止该 ip