fanym's blog


  • 首页

  • 归档

  • 搜索

日志输出的两个优化

发表于 2019-12-04

问题

日志是查找bug的重要线索,充分的日志信息可以快速定位问题,提高开发与项目维护效率,但目前的项目中有三种日志没有输出:

1、通过 sequelize-typescript 对mysql操作报错时,报错的sql语句没有输出。
2、没有捕获 Promise 的 报错,并对Promise的报错保存日志。
3、所有的接口调用没有输出入参与出参日志。

解决方案

1、通过调试可以看到 sequelize-typescript 的报错会将报错sql放入Error对象中,只要对其输出就可以了:

1
2
3
4
5
6
7
try{
await this.saveMyData();
}catch (e) {
if(e.sql){
LogManager.instance.onerror(`Error sql : ${e.sql}`)
}
}

2、没有对 Promise 的 rejection 进行处理就会抛出这个unhandledRejection事件,对其处理就可以了:

1
2
3
4
5
6
process.on('unhandledRejection',function(e){
LogManager.instance.onerror("unhandledRejection Error: " + (e.stack || e));
if(e.sql){
LogManager.instance.onerror("unhandledRejection Error sql :" + e.sql);
}
});

3、这个是最影响开发效率的,但由于用了protobuff,在现有设计上难以实现输入输出日志。
后面实现了,看这篇
node对ProtoBuf解析进行日志输出的实现

服务器日活动模拟测试方案

发表于 2019-08-16

背景

测试人员需要一天测试像每日签到的多日活动.之前采用的方案是将数据库当前的记录提前一天.这个方案有如下缺点:

  • 修改数据库记录操作繁琐,且当有多条数据记录需要修改时更加繁琐且有可能遗漏.
  • 对内存中的日期数据判断无法修改.
  • 对数据库记录提前一天,与真实环境系统时间加一天存在差异,不够接近真实环境测试.

方案

所以采用的方案是修改服务器系统时间来进行测试
ubuntu 命令
修改系统改时间

1
sudo date -s 2019-08-19

测试后需要同步时间,同步当前时间需要安装 ntpdate

1
sudo apt-get install ntpdate -y

同步阿里源时间命令

1
ntpdate ntp1.aliyun.com

进一步优化测试流程,可以做一个管理后台给测试用。我做了一个极简的管理后台(毕竟不是专业前端)
minimalist-admin

关于条件调试,与日志调试,远程调试

发表于 2019-08-09

背景

由于日志输出不够灵活,同时为了查找 bug 多余的日志输降低代码的可读行与污染常规日志输出,所以使用调试是寻找业务 bug 的最有效的方法,针对开发服采用远程调试启动服务测试。

处理

为了解决远程调试导 debug 导致影响其他测试人员的情况,找到了日志调试.
之前调试有几个痛点
1 循环或大量请求中满足条件断点的情况,总要一步步断点–条件断点解决
2 断点太长导致客户端连接断开,且影响其他用户操作.–日志断点解决
VSCode 使用日志断点中输出变量为 {变量名}

注意

远程调试有两个需要注意的点
1 本地代码与远程代码不一致。可以通过 rsync 命令进行差异对比。如果发现差异,则与其它开发人员同步代码。
2 进行远程调试时,另一开发者远程先接入的情况,会导致后接入的连接超时,需要开发人员协调。
3 不建议在远程调试上进阻塞调试,影响测试人员测试。

tip:差异比较命令 rsync -rcnv ./bin/ ./bin2/_

通过ssh做内网穿透,替代TeamViewer等远程桌面

发表于 2019-07-30

背景

公司为了安全很多服务放在内网中,导致开发只能在公司网络环境下进行.导致有些问题无法及时处理,其中两个同事的解决方案是 TeamViewer 远程到自己电脑的方式实现,

方案一

似这样的远程桌面,利弊是很明显的

利: 开发环境就是公司主机与工作环境完全一致,环境导致部分服务无法使用或开发环境导致的问题少。
弊: 因为远程桌面传输了大量图像界面的数据还有网络延迟导致远程开发卡顿,从而开发体验不如本机开发,还有就是无法分享多人使用.

最后我选用比较熟悉和简单的ssh内网端口映射至外网的方式,需要自己有云服务器

最后对svn,git,ssh 等服务采用直接端口映射的方式,这个方式的缺点就是安全性和服务网络端口变化需要做相应配置调整.
ssh做好无密码登陆后的主要命令是:

1
ssh -fNR <外网端口>:<内网ip>:<内网端口> root@<外网ip>

为了连接稳定一般把ssh 换为autossh

需要注意外网主机sshd配置中GatewayPorts 为true,否则开启的端口只有外网主机可访问,自己的工作机无法访问.

通过以上方式基本上实现了可以在家办公。

方案二

对svn,git,ssh 等映射配置,在服务器多环境复杂时会增加配置的工作量。最后还是换为远程桌面了,不过是用windows自带的远程桌面,通过ssh将3389端口映射出去,相比TeamViewer等更安全,不用注册账号。windows自带的远程桌面似乎也是差异更新画面的,并不怎么卡。

记一次联合查询Sql语句优化

发表于 2019-07-02

优化前

1
2
3
4
5
6
7
8
SELECT a.id, a.user_name, a.user_code, a.head_url, ifnull(b.red_packet_received_amount, 0) AS red_packet_received_amount,
a.create_time
FROM (select * from t_player_data WHERE openinstall = '24735' )a
LEFT JOIN (SELECT user_id, SUM(amount) AS red_packet_received_amount
FROM t_red_packet_order
WHERE is_received = 1
GROUP BY user_id
) b ON b.user_id = a.id;

耗时间 4s

优化后

1
2
3
4
SELECT a.id, a.user_name, a.user_code, a.head_url,SUM(IF(b.is_received = 1, b.amount,0)) AS red_packet_received_amount,
a.create_time
FROM (select * from t_player_data WHERE openinstall = '24735' )a
LEFT JOIN t_red_packet_order b ON b.user_id = a.id GROUP BY id;

<<<<<<< HEAD

耗时0.11s

分析

可以看到虽然查出的结果一样的但时间差距不是一个数量级的.原因就是第一条sql中

耗时 0.11s

分析

可以看到虽然查出的结果一样的但时间差距不是一个数量级的.原因就是第一条 sql 中

c114d5355af16519045d17f51cf1bd5b2c7277b7

1
SELECT user_id, SUM(amount) AS red_packet_received_amount FROM t_red_packet_order WHERE is_received = 1 GROUP BY user_id

<<<<<<< HEAD
语句会产生很大的临时表,把预计单独执行就耗时3s多,所以通过”select * from t_player_data WHERE openinstall = ‘24735’”产生的id去筛选结果省去了临时表的生成从而提高了效率.
=======
语句会产生很大的临时表,把预计单独执行就耗时 3s 多,所以通过”select * from t_player_data WHERE openinstall = ‘24735’”产生的 id 去筛选结果省去了临时表的生成从而提高了效率.

c114d5355af16519045d17f51cf1bd5b2c7277b7

为js编写d.ts声明文件,js与ts导出兼容

发表于 2019-06-03

ym-mongodb-sql添加 ts 支持时发现:
ts 引用类的方法无法使用,查看变异后的代码发现,ts 引用类转为 js 中会加 default,但 js 引用类却没有,为了兼容二者。js 导出模块需要添加 default 导出。
代码处理:

1
2
module.exports = MongodbSql;
module.exports.default = MongodbSql; //兼容ts写法

当皇上小游戏优化建议

发表于 2019-06-02

留存少不是没原因的,我也来当下策划。

1、首次进入游戏加载时间过长,要查下原因。

2、首页图片模糊,字体图案粗糙,文字碰越出边界,进入时间长了loading就会停下了,体验不好。

3、角色图片有点单一,好多只是衣服颜色换下,像3、4级就衣服差了一点,5、6级只是头饰换下,玩的都不好区分。。。。

4、文字图片适配问题,像商店没适配好。

5、还有看视频加速,和获取抽奖券我这里没生效,离线收益看视频翻倍,也没有翻倍的界面效果。

6、分享小游戏没有封面图。

合伙开发项目,果然没有公司的强制力,就做得太粗糙了,还有人撂挑子。。。。。

数据库的一次入侵

发表于 2019-04-05

背景

一般我都习惯对别人的服务器进行扫描端口看下有没漏洞。上次获取线上数据库权限是因为mongodb没设密码且开放端口。而这次获取到权限是网站的开放者在5个方面存在漏洞,而只要封住其中任何一个漏洞,我都无法获得里面的用户密码。

安全问题

1、git服务和官网放一起,导致被我端口扫描扫描到。

2、代码权限没控制好,新建的一个项目开放了拉取权限(估计是接手的人不熟悉)。

3、新建项目的代码中的mysql密码(mysql默认限制本地登录,所以我无法连接mysql)居然和git的管理员密码一样,让我可以获取到另外.net项目中的线上的mssql密码。

4、mssql 没限制本地连接,通过密码就可以连接上了。

5、数据库的用户密码只单纯做了MD5 加密,对于一些简单的密码可以解到明码。

后记

他们原来用.net 开发,用的框架居然是网狐棋牌游戏的框架来做网站,后来换为了thinkPHP,域名指向变了,就找不到了。

安卓app通信破解思路

发表于 2019-03-09

什么情况需要破解 app 通信

1、自动模拟用户行为调用接口,比如最近让人很烦的 某强国 app,和一些考勤 app 的签到,或者做 Dos 攻击。

2、获取 app 的通信内容,窃取信息或者对 app 服务器数据爬取获取用户信息或新闻数据。

3、找到服务器的权限判定漏洞。后端程序经常会把一些权限判断交给客户端而服务器未做权限判断的漏洞,可以做些越权之举。比如某立方。

破解方案

1、抓包

如果没有用 https 的可以直接抓包,并可以做中间人攻击。 (某立方在这一步,还有鲸鱼宝以前在这一步。

如果用了 https 则需要在客户端装上证书,就可以查看到 https 的加密内容。 (某我么在这一步

如果做了额外加密则装了证书也无法看到,需要分析客户端源码找到加密方法和加密密钥。(大部分的新闻 app 和 billli 会做到这一步)

也有没做额外加密的只做了 md5 校验的,这种情况可以获取数据但无法更改和发起数据请求,同上需要分析客户端源码找到加密方法和加密密钥。(比如某趣)

2、客户端分析

1、反编译看源码,加固的情况没试过,一般如果没做混淆就是裸奔,做了混淆也只是加件可以脱的衣服。根据接口参数的关键字去搜索代码分析,找到加密方法和加密 key,如果放在 so 中就是 c,c++的反编译分析了,没试过。

2、将反编译出来的包加日志或把日志开关打开再打回去做日志分析,没试过,要研究下。

3、同二如果 app 开发者不谨慎可能会把开发日志放出来,或引用的第三方日志,查看下日志也许可以发现什么。

4、如果是混合 app 如 react native 则分析 js 文件,没试过。

拿到通信权限做什么

<<<<<<< HEAD

拿到通信权限做什么

1、如果app的id是自增,则可以采用遍历的获取信息(facebook好像出过这种事故,大部分公司目前也是用id自增的方案),否则可以看有没有用户关系通过爬取关系网获取数据,没试过。

1、如果 app 的 id 是自增,则可以采用遍历的获取信息(facebook 好像出过这种事故,大部分公司目前也是用 id 自增的方案),否则可以看有没有用户关系通过爬取关系网获取数据,没试过。

c114d5355af16519045d17f51cf1bd5b2c7277b7

2、对系统权限测试,查找哪个地方权限没控制好。

3、看下用户登录是否有做验证吗,如果没有或简单的验证码,可以试下字典随机用户破解或单个用户暴破。破解成功后可以用撞库,试用户其它的账号,没试过。

https的原理分析

发表于 2018-12-29

背景

最近要上小游戏必须用wss进行通信,其实就是对应https的加密通信方式,需要购买ssl证书。

使用https的的作用就是防止中间人对接获信息的读取和篡改。

分析

证书流程:

第三方权威机构:签发证书加密私钥。

服务器:生成RSA公钥与私钥,第三方加密后的证书,证书内容包含域名,RSA公钥。

客户端:浏览器操作系统内置签发证书公钥,随机生成对称加密密钥K。

https所做的就是将客户端生成的密钥K不被中间人窃取与替换地提交给服务器。

通信流程:

1、客户端请求非对称加密RSA公钥,服务器返回权威机构加密后的第三方加密后的公钥。

2、客户端使用内置第三方公钥解密出RSA公钥,并检查域名是否一致。

3、一致后随机生成对称加密密钥K,用RSA公钥加密后提交给服务器。

4、服务器用RSA私钥解密出加密密钥K。

5、服务器与客户端同过密钥K通信。

这个流程就可以保证中间人无法对客户端服务器间通信的读取和篡改,例如域名劫持添加广告端现象。

一句话总结

https 就是先进行非对称加密交换对称加密的密钥,然后通过对称加密通信。

上一页1234下一页

fanyingmao

32 日志
43 标签
© 2021 fanyingmao
由 Hexo 强力驱动
|
主题 — NexT.Gemini v5.1.4
人 次