iOS小技能: get 和post 布尔值参数处理、按照时间分页的数据重复的处理

404 阅读3分钟

本文正在参加「金石计划」

前言

  1. get 和post 布尔值参数处理:如果后台Bool 参数没有同时支持【 0,1】 ;和【 true false】,get请求的时候就需要特殊处理。

  2. 按照时间分页的数据重复的处理

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逆向