事情是这样的,公司的服务器配置是一台一年一万多的阿里云windows,IIS + PHP5.3+Mysql5.5,讲道理,来这个公司之前,我都几乎没听过IIS,最近做了一个项目,本来一切都很稳定,平常,直到有一天,平静的生活被打破了。
由于项目开发周期短,所以基本就是实现了功能,优化安全这些才刚刚提上日程,但是有一天我的获取验证码接口,被类似呼死你这种机构抓取了,阿里的话费那肯定是唰就没了,这不行啊,赶紧想办法防御。
先从最简单的,捕获IP,人家也不是傻子,又是代理又是肉机的,行不通
时间紧迫,限制一下linux和windows不给发送吧,但是还是返回给他成功 ,然后发现限制了很大一部分,但人家可以用IOS啊
既然这样,接口加token,加签名,都可以限制一些,但这只是增加了他们的难度,并不能完全防御
最后,只能用最LOW但是也有效的方式了,加验证码吧……
你还别说,虽然LOW了点,但这确实管用
整个系统就这一个暴露在外的危险接口,而且可以不登录调用,于是我们就结合redis设了一个阀值,每秒请求达到指定次数就启用验证码。
好,这个问题解决了,但是忽然发现,所有接口的请求响应都异常的慢,仿佛在排队一样,所有接口都是假死状态,首先就排除了代码问题,因为业务代码的速度哪快哪慢我门清,那只能一步步排查了,于是那天晚上,我没有睡觉。
首先用工具测试了一下并发,10个并发1000次请求,就挂了!怎么可能!我写的代码再垃圾也不至于这样吧!肯定是别的原因,那就开始吧
一直恶心,但不敢随意触碰的东西一个一个试吧
首先就是这个脑残一般的IIS,换成Nginx,用最新的,改个端口号开始测试,使用框架单条查询大数据,挂了,单条小数据,还是挂,那换个框架试试呢,试了tp5,laravel,yii等等,发现yii明显好一些,但还是不行,那这是为什么呢
对了,由于框架对PHP版本的要求,还又把PHP升级到了7.1,我特么从此定义数组终于不用array()了!爽!
可能是mysql的问题?于是又去更改了各种MySQL配置,并发限制都放到1000了,实际并发量最多也就7,但就是不响应
MySQL也换掉!买了一个很便宜的阿里数据库,数据迁移过去之后,再测试,发现有明显好转,但还是不够。
干脆不使用框架,PDO查询单条大数据,WC,咋这么快?难道真的是框架的问题?
那就换一个框架放一部分业务代码试试,还是不行。
那,恶心人的东西就剩下这个Windows了,我自己有一台配置很垃圾的Linux,代码放上去,试一下。
慢,但是有响应,但这也太离谱了吧,几百块钱的Linux干掉了一万多的windows?
没办法,再买一个Linux,环境都用新的,代码放上去,再测试。
流畅了……
回家睡觉
最后总结一下,东西能用新,别用旧,别特么用IIS!别特么用windows服务器!
代码安全要早做!环境不舒服要早换!敏感接口尽量不要暴露在外!
对了还抽空测试了一下Tp官网,也无响应……可能是做了限制,或者说tp确实在这方面差一点