我正在使用 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,看起来很正常。我可以执行任何其他步骤来阻止他的攻击并保护我的服务器(聊天室)吗?
最佳答案
(来自最后一条评论) 啊,这意味着攻击者正在尝试使用 mysql 注入(inject)进行一些查询,所以首先你必须
1) 清理您的输入
如果您使用 pdo 或 mysqli,则使用绑定(bind)参数(准备好的语句)功能来过滤您的输入
或至少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 访问日志中所说的,您会发现这些 sleep 查询作为 GET 参数,因此,找到它并阻止该 ip
关于php - Php+MySql应用程序响应慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832194/