WRITING LOG · 03

技术博客

记录技术实践、问题排查和持续成长,把每一次解决问题的过程留下来。

WORKSPACE

文章阅读

神奇的空白字符
2022-07-01
今天在对接口的时候发现一个神奇的事情,API返回的csv数据中第一个字母是Date,但是在处理csv的时候无论如何取不到这个Date。直接在控制台打印看这个Date字段确实就是这样写的。我先是怀疑Date字段有空格或者编码跟其他字段不一样,分别使用php自带函数trim和mb_detect_encoding验证猜想。结果trim后依然不能和我打出的Date相等,字符集跟我用的代码字符集UTF8一致。然后用了strlen函数发现这个csv返回的Date是7个长度而不是4,这明显多了几个字符,于是我用base64来看了下加密结果。发现base64后比正常的Date单词结果多了【77u/】字符。完整的base64密文是77u/RGF0ZQ==,正常情况下base64_encode('Date')的结果是【RGF0ZQ==】。API返回的Date字段多个未知的空白字符。对,这个字符就是Bom头,直接输出不可见,害人精。
centos7用yum命令的时候报错Peer's Certificate has expired
2022-06-28
从字面意思就是访问的yum源地址ssl证书过期了,一般这种出现在本地虚拟机上可能是网络时间导致的,也可能是yum源自己的问题换下能用的yum源就可以了,比如阿里和腾讯的源。然而今天我发现换源yum clean all 再yum makecache也无效,仔细看报错后面https://repo.webtatic.com/yum/el7/x86_64/repodata/repomd.xml地址无法访问,我用浏览器访问也是报ssl证书错误。那可能就是仓库地址的问题了,我只能暂时允许yum跳过ssl验证:
# vim /etc/yum.conf
#在里面增加一句sslverify=0
保存后再运行就没问题了!
DDOS攻防战:凌波微步与七伤拳
2022-06-27
前阵子(2022-06-22)有自称ACCN的黑客组织采用DDOS方式攻击我司游戏服务器。最终导致游戏连续几天出现无法登陆连接的情况,攻击期间游戏服务彻底瘫痪,他们以此勒索公司交“保护费”。不过考虑到贼人不存在信用,有了第一次勒索难免第二次和第三次,我们选择了拒交保护费和这帮人硬刚。我在此记录下抗争历程,希望为后来者提供一些资料或者启发。
第一回合:首先这帮黑客选择了我们的游戏登陆服务器和日志服务器流量猛攻。由于游戏登陆服务器是裸ip且是单服务器不存在负载所以几乎没有任何防御手段,我查看了服务器网络安全组发现端口全开,只能先关闭除了必要的服务以外所有的端口。但是阿里云在检测到攻击后自动把服务器打入了黑洞90分钟,期间游戏完全瘫痪不可访问。这一回合完败。
第二回合:在公司确立要硬刚后我们开始找公司更有开发经验的同事交流了下,结论是要买DDOS高防,只能烧钱应对。我们看了下阿里云的DDOS高防服务,一个月最低防护也要4w以上,一年的高防好点的要98w显然目前是负担不起。随后我们申请了阿里的D高防体验一天。不过由于公网ip没有换,第二波攻击到来的时候高防仅仅是检测到攻击,依然被黑洞90分钟。第二回合也是完败。
第三回合:凌波微步。有了前面两次的失败总结下经验我开始催游戏放弃裸ip采用域名解析方式接服务器,然后把公网ip换了。因为这是最基本的防御,然后新创建了一个网络实例和一台传统负载均衡。我的假设是黑客是拿到客户端抓包后看到是裸ip直接攻击的ip,这样换了ip应该就能躲过一次攻击。果不其然,第三回合他们发起攻击后我就开始切换登陆服务的ip并且停掉暴露的网络ip。这次挂掉了的是日志服务,游戏主要服务也存在有玩家掉线的情况,但相比第二回合好很多。第三回合板回两成,也是算失败。这次终于见到了成效,也发现了这个自称ACCN的组织很懒散,根本不像真的黑客。没有实时跟踪游戏ip来进行攻击,不知道是肉鸡数量不够还是忙于攻击其他游戏,我更倾向于他们懒得每次攻击都去抓包查看新的游戏服务ip。总结起来多创建几个公网ip等到他们通知攻击的时候直接切换公网ip并关闭正在受攻击的ip是有效的,相当于你打我就躲,让你打不找,像凌波微步
第四回合:七伤拳。根据前面的经验发现我们还是能一定程度上多开攻击,那么能否反击呢。从常规思考来看是不可能的,首先攻击者基本都是攻击服务+肉鸡,发起攻击的人躲在暗处发攻击指令就可以了。从这个角度来看是只能挨打的。不过我思考一晚后提出几个假设:
1>> 国内网络环境相比海外还算比较干净,因为肉鸡大部分是有公网ip的服务器,国内的云服务监控相对更严,有肉鸡行为的机器在国内往往会被警告关停。那么肉鸡应该很大部分来自海外。
2>> 肉鸡要保证自己的攻击来源来自世界各地来防止攻击流量被过滤清洗,且攻击指令不会太复杂冗长。
基于以上假设加上前面游戏服务更新上了域名,我开始尝试用域名解析DNS的解析路线来做文章。因为域名解析的时候可以选择解析路线,只要把不同的路线解析到不同的IP上再配合网络日志流量分析就能分析出发起攻击的肉鸡的大致区域分布,然后把攻击比较猛烈的区域(主要是海外路线)解析ip记录为127.0.0.1。让他们发起攻击的时候攻击的是自己。这样做就相当于七伤拳,跟攻击路线一起来的真实玩家会连不上游戏,会损失一部分玩家,但是同路线的肉鸡发起攻击的时候攻击到的是肉鸡自己。先伤已,再伤人。果然,第四回合这套组合拳打下来服务基本就稳定了,美中不足的是会有个别玩家反映连不上,这群玩家挂了vpn或者本来就是海外玩家的居多。这回合平手,也可以算个小小的胜利。因为后续几天终于有了短暂的安宁。
总结起来其实DDOS在国内其实也不是完全没有招架之力,只是想要省心安全度过除了花钱似乎也只能自己琢磨跟犯罪份子斗智斗勇了。最后想说一句,不要向恶势力低头,抗争到底!
昨天公司游戏服务器遭遇DDOS攻击
2022-06-23
昨天收到自称ACCN组织的攻击预告,然后下午就开始遭到DDOS攻击,我们采取的防御手段都无效。总结起来还是因为刚开始游戏就暴露了真实ip,而且服务器配置是端口全开的。加上这款游戏在taptap上架测试玩家反响还不错,这样一来游戏就被恶人盯上了。对方先是通过官方游戏交流群联系到我们工作人员预告攻击,攻击结束后开始索要“保护费”,我们打算不惯着他们开始寻求解决方案。
先是尝试关闭多余的服务端口,做数据清洗。然后跟阿里云申请了一天的高防DDOS服务,不过截止于今天下午14点我们依旧毫无招架之力。因为游戏最开始就没有配置域名和slb而是采用的ip直连,真实ip是暴露的,阿里云提供的高防策略无法生效。加上对方攻击异常猛烈流量清洗也没有效果,确切来说是来不及清洗请求就被阿里云扔进黑洞了,服务器等于ban掉的状态。阿里云提供的付费高防服务对于目前的游戏体量两说是无法负担的(一个月大概5w人民币左右)。
阿里云的黑洞处理个人认为弊端也不小,一旦收到攻击就被扔进黑洞90分钟,相当于DDOS只需要攻击几分钟就可以让服务器瘫痪一个小时以上,黑洞很难通过控制台自行解除。
砥砺前行吧,同恶势力斗争到底!
苹果销售数据API报错FORBIDDEN.REQUIRED_AGREEMENTS_MISSING_OR_EXPIRED
2022-06-22
最近公司的苹果内购抓取接口一直报错返回403代码。开始以为是密钥过期了,去苹果后台看了说明密钥是长期有效的,问了同事都没人动过。排查报错日志详情发现苹果接口返回:
{
 "errors" : [ {
  "id" : "XXXXXXXXXX",
  "status" : "403",
  "code" : "FORBIDDEN.REQUIRED_AGREEMENTS_MISSING_OR_EXPIRED",
  "title" : "A required agreement is missing or has expired.",
  "detail" : "This request requires an in-effect agreement that has not been signed or has expired.",
  "links" : {
   "see" : "/agreements"
  }
 } ]
}
原来是苹果更新了开发者协议,必须登苹果主号然后打开链接https://developer.apple.com/account/#!/overview/D8KF282UZZ,在弹出的协议中点agreement就可以了。不得不说苹果真是刚。
支付宝周期付款(alipay连续包月)入坑指南
2022-06-14
最近接了支付宝的连续包月,还是够折腾。比起苹果连续订阅有好的地方也有坑人的地方,这里记录下。
支付宝连续包月申请门槛略高,还好商务提前搞定技术这边接入API就行了。技术文档地址戳这里>>>
总结起来有这些坑:
1、支付宝连续包月不支持沙盒测试且支付扣款周期最短为7天(最多可以提前5天扣款),意味着测试周期很长无法缩短。
2、包月到期后的自动续订需要自己通过支付宝收费接口发起扣款,支付宝不主动扣费,一旦超过设置的扣款期限就无法发起扣款需要自己调整当次扣款时间。
3、支付宝周期付款需要先通过签约接口让用户跳到支付宝的h5签约页面,完成签约后才可以发起扣款。
此外,实测支付宝签约页面可以重复使用,不同的用户可以打开同一个签约页面进行签约,当然也可以每笔扣款都单独签约。
关于ssl证书在苹果和PC上正常却在安卓手机上无法访问的问题
2022-06-10
前面说了怎么实现免费的ssl证书自动续期,在实际操作中给域名配置泛域名证书遇到了安卓提示证书无效却可以在电脑和手机上正常使用的问题。
最后查了资料发现是缺了中间证书,freessl配置好后应该使用fullchain.cer和xxx.key两个证书文件,其中fullchain.cer里面是三段证书,包含自己的证书、签发机构的证书和根证书。freessl的免费证书每三个月就会过期,由于我们的业务要用到slb负载均衡不能直接配置到nginx,证书只能手动上传到slb上不能自动部署。有条件还是花钱买证书好~
免费ssl证书的自动续期
2022-06-06
做网站和API经常会需要域名相关的东西,随着现在主流平台的开发方向都逐渐要求https域名,域名ssl配置开始变得必不可少。腾讯和阿里的免费证书是可以用的,缺点是需要每年都需要自己去重新申请一遍证书然后部署到对应的服务器上。当然也可以采用云服务商提供的一键部署(收费)或者自己上传证书到slb(负载均衡)上自动部署。总之就是常规做法下无法避免手动操作。这时候要做到自动续期免费证书就需要自己写脚本或者爬虫了。当然也可以用别人写好的,比如acme.sh。下面就说下freessl.cn下自动续期免费ssl证书:
先去freessl.cn用邮箱注册个账号,然后直接申请免费证书。我这里选的亚信的证书:
接下来需要根据freessl的提示去自己的买的域名服务商那边添加解析验证NDS解析。
然后根据提示在服务器上下载安装并运行acme.sh就可以了。
需要注意的一点是,acme.sh在Linux下运行后一般会自动新增一条crontab定时任务,也就是说ssl证书会在定时任务下自动更新,apache和nginx配置下完全可以只配置一次ssl证书地址就自动续期,完美!