建站一个月几乎每天都被攻击。。求解决思路

2014-12-23 21:42:53 +08:00
 Jack

建站一个月。。。几乎每天都在被攻击。。。而且道高一丈魔高一丈的。。。攻击方法不断升级。。。

我的架构是nginx php mysql,今天搭上了SSDB,依旧未管用

主要攻击是在搜索页,一开始是单一ip单一词汇刷而已
封了ip以后变成n个ip不停刷
于是我就把搜索使用的词封掉,于是变成n个8-10个词的组合不停的刷,就这也算有规律可循
但是到了今天变成了拿字典来刷,完全无规律组合词多ip不停搜索

一上来我就挂,即使我把搜过的纪录全放到了SSDB,但是还是一刷就挂,一堆新组合词语,mysql瞬间200%,nginx 503。

最后只能放上了验证码,机制是搜索10次填写一次验证码。。。至于这个办法是否管用现在还不知道。。。

有人建议用sphinx,我还没用,貌似文档不太友好,对我这个非技术人员比较头疼。。。

求专业技术大拿提供解决问题思路。。。

15965 次点击
所在节点    程序员
146 条回复
Jack
2014-12-23 22:09:18 +08:00
@20150517 好吧。。。看来要忍受验证码常态化了。。。
yunshansimon
2014-12-23 22:12:18 +08:00
@Jack 换IP这种攻击,如果你还要运行什么行为分析代码,服务器早over了,只能堵他是机器人的漏洞。他的客户端就干一个事,换不同ip(断网拨号,或者在VPN里面切换),post查询。你可以这样试一下,在查询页面里加一个隐藏随机码,这个随机码同时放到session里面,获得post后,检查随机码是否等于session里保存的随机码,不等于就404。这用来防止无脑post型,就算他写代码,也必须先get你的网页,解析加入查询内容,然后才能提交,他也需要很多内存。
Jack
2014-12-23 22:13:50 +08:00
@yunshansimon 我也发现了。。。记录ip分析啥的完全无用。。。上来直接就挂。。。
zhs227
2014-12-23 22:16:43 +08:00
20150517 提到的这个是好办法

我又想到,如果IP确实太多封不完的话,最关键保护方法有两点:

1. 不要让搜索结果页面异常(比如ban IP 或404),或者至少让攻击者很难分辩结果页面是否专门针对攻击设计

2. 即使攻击者发现了结果不对(比如是缓存结果),也不能让他找到为什么结果不对(隐藏识别算法)。就像 @20150517 说的一样,在页面请求的时候js初始化一个cookie(比如md5(ip)之类的),然后判断没有cookie的请求一律返回cache页面。
salemilk
2014-12-23 22:17:01 +08:00
神马网站这么火啊?
nilai
2014-12-23 22:19:08 +08:00
小型CC。 改程序就应该能搞定。
moname
2014-12-23 22:24:16 +08:00
访问此页面: http://huo360.com/v 出现一些错误

A PHP Error was encountered

Severity: Warning

Message: array_multisort(): Array sizes are inconsistent

Filename: v/main.php

Line Number: 74
oott123
2014-12-23 22:28:08 +08:00
Jack
2014-12-23 22:32:59 +08:00
@moname 已修正,谢谢
pubby
2014-12-23 22:41:33 +08:00
shpinx中文不行啊,得用coreseek 不过这货几年没更新了

用coreseek在索引不大的情况下大概是 30ms 每查询

如果你都是简单查询视频名称的话,可以考虑自己先弄一份分词好的映射表,直接丢内存查找


不过话说回来,人家铁了心要搞你,到时候还是会有新花样出来的。
Jack
2014-12-23 22:50:37 +08:00
刚才瞬间被爆了,验证码也没啥用了,就是海量请求。。。秒挂,然后又秒好,只能听天由命了么。。
Jack
2014-12-23 23:04:24 +08:00
@pubby 我只想解决速度问题。。。shpinx能解决每秒几百次的模糊查询么。。。
dbas
2014-12-23 23:07:05 +08:00
同你程序无关,小小的cc攻击,只有自动封ip最合理
我都是这样处理的
jyoe
2014-12-23 23:09:49 +08:00
流量攻击无非是求财,逼你做广告啥的。
cevincheung
2014-12-23 23:13:44 +08:00
@Jack 每秒几百次还是妥妥的。sphinx给出数据在mysql中的ID,然后根据ID去MySQL中检索数据。

ID关联的MySQL结果可以缓存到Redis。Hash还是很有效的。

Ps。不要说你的db、web、proxy都在一台服务器上…… - -#
Jack
2014-12-23 23:17:21 +08:00
@jyoe 想交保护费都不知道去哪儿交啊。。。
nilai
2014-12-23 23:18:14 +08:00
Ci写的。好多地方有漏洞哦
Jack
2014-12-23 23:18:42 +08:00
@cevincheung 小弟不是做技术的- -,再说网站流量还不大,我还没觉得有必要去弄这些。。。
lsylsy2
2014-12-23 23:19:13 +08:00
上CDN试试?
国内安全宝 360,国外CloudFlare
yangxin0
2014-12-23 23:23:26 +08:00
把nginx的请求数量限制。 设置一个mysql不会挂的数值。内核的syn_cookie打开.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/156129

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX