博客群里的网友都说网站真实IP没隐藏有巨大的被D风险。隐藏网站真实IP最简单的办法就是做内容分发网络,用户在访问网站的时候是访问就近的CDN节点,ping出来的IP也是CDN节点IP,有效阻断了对源站服务器IP的探测。
网上有很多免费的CDN可供使用,如百度云加速,但是普遍存https不支持或者收费。并且多数CDN都提供了一定量的抗D清洗服务。只不过都很低,在真实DDOS攻击下,瞬间就荡然无存了。真正有用的也就是隐藏真实IP这一个功能了。
下午没事开始折腾CDN,网上找了一圈也没合适的,群里推荐的上海云盾,流量限制50G,目前限时免费阶段。尝试注册了一下,发现需要实名认证提交后,3个工作日审核,审核通过才能使用。接着有看了下百度云加速,发现免费版本不能支持https,需要购买专业版以上才能使用,最低的专业版1190一年。所以放弃了。鉴于网站部署在阿里云CDN上,就在阿里云上看了下CDN的产品介绍。可惜,自从12月1号就进入商业收费模式了。不想再另寻CDN了,其它服务商肯定也是要认证的,这大放假的肯定没人,所以就直接阿里云CDN吧。支付120元500G一年的量另加https的请求包50元,不知道被攻击一次,被消耗的量算不算在内了。
晚上吃完饭准备来改造登录后修改用户名和添加用户网站信息这块功能。发现点击QQ登录后,无法正常跳转到登陆后的界面,卡在callback地址上不动了。虽然我知道是CDN造成的,但是没明白问题出在哪儿,就正常逻辑开始排查代码。先把站点调试模式(TP5的app_debug
)关了,然后再次登录,看到错误信息3001。这个错误码是我自己定义的改造后的qqconnect错误码。
查源码Oauth.php(原Oauth.class.php)发现问题出在防CSRF攻击的state上。再次尝试登录,看了下地址栏callback后的code参数和state参数一切正常。也就是说授权动作执行完成了。那么问题就出在这个比对问题上了,我是通过TP5的助手函数input获取的state。尝试dump了一下state和code。都显示为空,没有获取到地址栏上的参数,无法和程序中的state变量比对,造成的错误。以为是助手函数的问题,又原本请求了一次,还是没有,最后使用原生$_GET也还是没有请求到内容。
冥想了一下,地址栏上的信息是被构造出来的,那么我访问的数据是CDN节点缓存给我的,地址栏的数据没有和我源站产生交互,突然想到下午在折腾CDN配置的时候的参数过滤问题了。阿里云的CDN有保留参数回源的设置,并且我还在后台测试的时候传输的ID和分页参数添加过了。天呐,这是有多蠢,竟然忘了这一出。迅速进入阿里云CDN控制面板,在域名管理里面,过滤参数中设置好保留的code和state两个参数。刷新页面后重新使用QQ登录,就一切正常了。