前言
- get 和post 布尔值参数处理:如果后台Bool 参数没有同时支持【 0,1】 ;和【 true false】,get请求的时候就需要特殊处理。
- 按照时间分页的数据重复的处理
I、使用NSNumber 传BOOL值的处理
使用NSNumber 传BOOL值参数时,需要区分get 和Post进行处理。
get请求对应的0和1,post对应true/false:若服务端Bool 参数没有同时支持这两种格式,就需要处理。
1.1 问题分析:
使用NSNumber 传BOOL值的时候,get 和post对应的参数不一致
[params setValue:[NSNumber numberWithBool:self.viewModel.multipleSwitchCellTableViewCellModel.IsSon] forKey:@"IsSon"];//
这个代码使用Post 会将请求参数IsSon 自动转为true/false
但是get 请求的时候就是默认0和1 不会进行将参数IsSon 自动转为true/false
1.2 解决方案
如果后台get请求没有同时支持【 0,1】 ;和【 true false】,只支持true false的时候,就需要特殊处理。
- get请求的正确处理
// get 不会自动转为 "IsSon": true,// "IsSon": false,
//get 需要自己处理
if(self.viewModel.multipleSwitchCellTableViewCellModel.IsSon){
[params setValue:@"true" forKey:@"IsSon"];//
}else{
[params setValue:@"false" forKey:@"IsSon"];//
}
II 按照时间分页的数据重复的处理
2.1 数据重复原因
问题:按照时间分页的数据重复
原因:请求下一页之前,有新的数据入库
2.2 解决方案
解决方案:分页接口新增一个请求参数,用于记录第一页的最大排序时间(比如第一条记录的交易时间)。
2.3 案例
例子:账单流水分页接口新增一个请求参数MaxCompleteTime最大交易时间,存储的是第一页的第一条记录的交易时间,用于处理下一页返回的数据。避免请求第一页之后,有新数据入库,导致第二页返回的数据和第一页重复。
用法: MaxCompleteTime是上一页的第一条交易记录的完成时间CompleteTime。 "MaxCompleteTime" : "2022-11-10 17:33:58"
III 扩展:敏感逻辑的保护
3.1 把函数名隐藏在结构体里,以函数指针成员的形式存储
把函数名隐藏在结构体里,以函数指针成员的形式存储。
编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛
// Created by devzkn on 18/09/2017.
// Copyright © 2017. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface KNUtil : NSObject
/**
把函数名隐藏在结构体里,以函数指针成员的形式存储。
编译后,只留了下地址,去掉了名字和参数表,提高了逆向成本和攻击门槛
*/
typedef struct _util {
void (*checkKNSign)(char *keys[], unsigned char *output);
}CheckKNSignUtil_t ;
#define ShareKNUtil ([KNUtil sharedUtil])
+ (CheckKNSignUtil_t *)sharedUtil;
- 调用方法
ShareKNUtil->checkKNSign(key, output);
3.2 使用宏进行替换字符串
- 根据前缀搜索出需要混淆的类名、方法名, 生成对应的宏文件
#define run OmWJoTZfCqoPshvr
#define iosre egnjoOFDrFiQVRgr
静态分析时hopper等反汇编工具无法根据string搜索到关键字符
see also
公号:iOS逆向