Php + MySql应用程序响应缓慢

时间:2015-06-14 17:07:30

标签: php mysql ubuntu nginx

我正在使用mysql + php运行聊天室(phpfreechat)。我有一个专用的服务器来运行这个脚本,因为它可以消耗大量的资源。 100个并发用户可以很好地工作。然而,最近一位用户威胁我们杀死这个聊天室,他成功地做到了这一点:(

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

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看起来很正常。我可以执行任何其他步骤来阻止他的攻击并保护我的服务器(聊天室)吗?

1 个答案:

答案 0 :(得分:1)

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

1)清理您的输入

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

或至少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