iOS开发实战之Cookie注入

sasukeo· 2017-07-26
本文来自 Mint丶bin的简书 ,作者 sasukeo

原文

Cookie注入的使用场景:

在开发中,我们常常会遇到这样一种场景:通过在一部分网络请求中注入Cookie信息让后台校验当前用户的登录状态以及用户权限

  1. 在APP中打开一个需要登录用户才能看的页面,一般客户端会先判断是否登录,如果没有登录去登录。缺点每次都要判断,如果是付费内 容,还要引导用户去支付,这些都要去后台发起多个请求,去判断,增加了网络开销,如果逻辑处理的不够严谨,容易出错

  2. Cookie的注入可以解决上面的问题,一次请求将用户信息发送给后台,让后台判断给你什么数据,你只用按约定判断返回的字段,做出相应的处理即可,这样减少了用户请求的次数,减轻了服务器的负载,也省了用户的 流量

第一步:获取登录成功的请求标识:如:PHPSESSID=495njbid8as3o79bjqh1mocl22

注:"PHPSESSID"这个字段名不同的服务器配置不同,名称也不同,可以询问后台,不过我建议还是自己去抓包查看,这里我使用的抓包工具是:Charles,网上有破解版的。

一般客户端会在登录成功的回调里面获取Set-Cookie,对Set-Cookie处理获取内部的"PHPSESSID=495njbid8as3o79bjqh1mocl22"

我们先通过抓包工具来看看登录成功返回的信息:

登录成功抓包

1. 查看一下Cookie信息(包含Set-Cookie信息)

Cookie信息

注意:这里我们可以看到三条Set-Cookie信息,这是服务器端告诉你下次请求的时候需要在请求头中加入这三条信息。只是第二条和第三条是用户的账户名和经过MD5加密的密码,这个我们就是我们上传给服务器的,不用提取,不过需要按照"topmasteruserName=17737199679;"这种服务器要求的格式拼接Cookie字符串。

2. 我们再来看看客户端获取的Set-Cookie信息(有请求响应Cookie中三条Set-Cookie拼接成的),需要注意的是每次获取到的Set-Cookie字符串中它们的排列顺序不同:

获取Set-Cookie

3. 得到这个字符串后,就是想办法提取PHPSESSID=495njbid8as3o79bjqh1mocl22了(后面的path=/等不需要)

提取PHPSESSID

4. 保存信息到本地

保存用户信息

5. 拼接Cookie字符串

拼接Cookie字符串

6. 到这里需要向服务器注入的Cookie已经准备好了,只需要在发起请求的时候设置请求头的Cookie即可;

(1)AFNetworking 注入Cookie

[manager.requestSerializer setValue:[FunctionFast getCookieFromUserDefault] forHTTPHeaderField:@"Cookie"];

(2)UIWebView中请求注入Cookie,一般公司限制会员/付费用户才能查看

- (void)requestData {
    NSURL *url = [NSURL URLWithString:self.url];
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:10];
    // 注入Cookie
    [request setValue:[FunctionFast getCookieFromUserDefault] forHTTPHeaderField:@"Cookie"];
    [self.webView loadRequest:request];
}

到这里已经满足基本需求了,其他细节如注入Cookie后的请求包的解析,还有WKWebView的Cookie注入后续更新介绍...,如有错误的地方,欢迎亲们指正。

亲们喜欢的话,请给个?? 额,谢谢亲们的支持!!!