全部产品
弹性计算 会员服务 网络 安全 移动云 数加·大数据分析及展现 数加·大数据应用 管理与监控 云通信 阿里云办公 培训与认证 智能硬件
存储与CDN 数据库 域名与网站(万网) 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网 更多
Web 应用防火墙

iOS 接入文档

更新时间:2018-05-15 17:14:12

本文介绍了使用 iOS App 接入 WAF SDK 的操作方法。

SDK-iOS 文件说明

下载并解压 WAF SDK 包(点击获取SDK),在 sdk-iOS 文件夹下,提供了以下文件:

sdk-iOS

各文件说明如下:

文件 功能
SGMain.framework 主框架SDK
SecurityGuardSDK.framework 基础安全插件
SGSecurityBody.framework 人机识别插件
SGAVMP.framework 虚拟机插件
yw_1222_0335_mwua.jpg 配置文件

项目工程配置

参照以下步骤,来配置项目工程。

  1. 添加 Framework。将 WAF SDK 中提供的 4 个 .framework 文件添加到工程的依赖库中。

    添加依赖库

  2. 设置链接选项。

    添加链接选项

  3. 添加系统依赖库。

    添加系统依赖库

  4. 引入配置文件。将 SDK 中的 yw_1222_0335_mwua.jpg 配置文件加到 mainbunle 下。

    引入配置文件

    在应用集成多个 target 的情况下,请确认 yw_1222_0335_mwua.jpg 配置文件加入到正确的 Target Membership 中。

    加入正确的 Target

代码编写

1. 初始化SDK

接口定义

  1. + (BOOL) initialize;

接口描述

  • 功能:初始化SDK。

  • 参数:无。

  • 返回值:BOOL类型。初始化成功返回YES,失败返回NO。

调用方式

  1. [JAQAVMPSignature initialize];

示例代码

  1. static BOOL avmpInit = NO;
  2. - (BOOL) initAVMP{
  3. @synchronized(self) { // just initialize once
  4. if(avmpInit == YES){
  5. return YES;
  6. }
  7. avmpInit = [JAQAVMPSignature initialize];
  8. return avmpInit;
  9. }
  10. }

2. 签名请求数据

接口定义

  1. + (NSData*) avmpSign: (NSInteger) signType input: (NSData*) input;

接口描述

  • 功能:使用 avmp 技术对 input 的数据进行签名处理,并且返回签名串。
  • 重点注意: 被签名的请求体应该跟客户端实际发送出来的请求体完全一样,完全一样的含义包括请求体中字符串的编码格式、空格、特殊字符以及参数的顺序等等,否则会造成验签失败。
  • 参数:见下表。

    参数名 类型 是否必须 说明
    signType NSInteger 签名使用的算法,目前是固定值,输入 3。
    input NSData* 待签名的数据,一般是整个请求体(request body)。如果请求体为空(如POST请求的body为空,或是GET请求),那么此参数使用 null。
  • 返回值:NSData*类型,返回签名串。

调用方式

  1. [JAQAVMPSignature avmpSign: 3 input: request_body];

示例代码

客户端向服务器端发送数据时,需要调用 avmpSign 接口对整个 body 数据进行签名处理,之后会得到签名串。该签名串就是 wToken。

  1. # define VMP_SIGN_WITH_GENERAL_WUA2 (3)
  2. - (NSString*) avmpSign{
  3. @synchronized(self) {
  4. NSString* request_body = @"i am the request body, encrypted or not!";
  5. if(![self initAVMP]){
  6. [self toast:@"Error: init failed"];
  7. return nil;
  8. }
  9. NSString* wToken = nil;
  10. NSData* data = [request_body dataUsingEncoding:NSUTF8StringEncoding];
  11. NSData* sign = [JAQAVMPSignature avmpSign: VMP_SIGN_WITH_GENERAL_WUA2 input:data];
  12. if(sign == nil || sign.length <= 0){
  13. return nil;
  14. }else{
  15. wToken = [[NSString alloc] initWithData:sign encoding: NSUTF8StringEncoding];
  16. return wToken;
  17. }
  18. }
  19. }

注意:如果请求体为空,也需要调用 avmpSign 接口生成 wToken,第二个参数直接传空即可。示例代码如下。

  1. NSData* sign = [JAQAVMPSignature avmpSign: VMP_SIGN_WITH_GENERAL_WUA2 input:nil];

3. 将 wToken 放进协议头

示例代码如下:

  1. #define VMP_SIGN_WITH_GENERAL_WUA2 (3)
  2. -(void)setHeader
  3. {
  4. NSString* request_body = @"i am the request body, encrypted or not!";
  5. NSData* body_data = [request_body dataUsingEncoding:NSUTF8StringEncoding];
  6. NSString* wToken = nil;
  7. NSData* sign = [JAQAVMPSignature avmpSign: VMP_SIGN_WITH_GENERAL_WUA2 input:body_data];
  8. wToken = [[NSString alloc] initWithData:sign encoding: NSUTF8StringEncoding];
  9. NSString *strUrl = [NSString stringWithFormat:@"http://www.xxx.com/login"];
  10. NSURL *url = [NSURL URLWithString:strUrl];
  11. NSMutableURLRequest *request =
  12. [[NSMutableURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:20];
  13. [request setHTTPMethod:@"POST"];
  14. // set request body info
  15. [request setHTTPBody:body_data];
  16. // set wToken info to header
  17. [request setValue:wToken forHTTPHeaderField:@"wToken"];
  18. NSURLConnection *mConn = [[NSURLConnection alloc]initWithRequest:request delegate:self startImmediately:true];
  19. [mConn start];
  20. // ...
  21. }

4. 发送数据到服务器

将修改好协议头的数据发送到 WAF,并解析 wToken 进行风险识别,拦截恶意请求后,再把合法请求回源。

错误码

上述的 initialize 和 avmpSign 接口有可能会出现异常。如果生成签名串异常或失败,请在 console 中搜索 “SG Error”。

常见错误信息及描述见下表。

错误代码 含义
1901 参数不正确,请检查输入的参数。
1902 图片文件有问题。一般是获取图片文件时的 apk 签名和当前程序的 apk 签名不一致。请使用当前程序的 apk 重新生成图片。iOS 可能是因为 BundleID 不匹配。
1903 图片文件格式有问题。
1904 请升级新版本图片。AVMP 签名功能仅支持 v5 图片。
1905 没有找到图片文件。请确保图片文件 yw_1222_0335_mwua.jpg 在工程中。
1906 图片中缺少 AVMP 签名对应的 byteCode。请检查使用的图片是否正确。
1907 初始化 AVMP 失败,请重试。
1910 非法的 avmpInstance 实例。可能原因有:
  • AVMPInstance 被 destroy 后,调用 InvokeAVMP。
  • 图片 byteCode 版本与 SDK 不匹配。
1911 加密图片的 byteCode 没有相应导出的函数。
1912 AVMP 调用失败。请联系我们。
1913 AVMPInstance 被 destroy 之后,调用 InvokeAVMP 出现该错误。
1915 AVMP 调用内存不足,请重试。
1999 未知错误,请重试。
本文导读目录