Mitmproxy 拦截、mock移动设备网络请求
本文主要介绍使用mitmproxy拦截、mock移动设备网络请求,讲解的硬件环境是mac + Android手机,其中的部分方法Linux、Windows平台和IOS同样适用。
- 背景
- Mac上安装、启动mitmproxy
- 手机端配置,开始拦截
- mitmweb操作页面如何使用
- mitmproxy拦截Debug版APP的Https请求
- 结语
背景
拦截http proxy的软件很多,如 Fiddler,Charles等,能够实现对http通信的拦截,可以查验Request和Response参数,特别是移动设备快速普及,此类软件逐渐被用于移动设备APP的网络请求拦截。
为什么要拦截APP的网络请求呢?查看Request和Response又有何用呢?抛开干坏事不说,主要有两点:1、测试开发人员通常需要查看Request和Response内的信息是否正确,更重要的是随意改变Response内部数据,mock极端数据,达到测试软件的目的;2、查看相似APP的网络请求方式和数据组织方式(心照不宣)…………
为什么介绍mitmproxy,当然是因为它更好!刚才说的是http请求,https请求怎么办?最少Charles不灵了,咱们需要mitmproxy,新版的mitmproxy界面友好,操作简便,能够拦截https请求,并且可以mock数据!
一、Mac上安装、启动mitmproxy
1、Python环境配置 具体安装步骤可参照Mac上安装python环境
(1)安装Python 2.7.*,可以下载安装,也可以使用
brew install python
(2)安装pip
easy_install pip
(3)安装virtualenv
pip install virtualenv
(4)更新brew
brew update
2、clone 最新的mitmproxy
git clone ssh://git@git.sankuai.com/qa/architect-mitmproxy.git
3、启动mitmproxy
(1)进入操作目录
cd architect-mitmproxy
cd mitmproxy
(2)启动mitmproxy
$ xcode-select --install
$ ./dev
$ source ../ven.mitmproxy/bin/activate
$ python setup.py install
$ ./mitmweb (启动mitmweb)
(3)最后在chrome打开 http://localhost:8081/
(4)第二次启动时,如果直接使用 ./mitmweb 命令失败,可以先执行一下source ../ven.mitmproxy/bin/activate,再执行./mitmweb。
(5)若端口8080被占用,可通过运行mitmweb –port “任一可用端口”更改,更改为你想用的端口
二、手机端配置,开始拦截
点击手机中得设置
设置代理
IP为mac电脑本机IP
(注意:可以使用ifconfig查看本机IP,如果是浮动IP,IP可能过一段时间会改变,需要重新设置!)
端口为8080
三、mitmweb操作页面如何使用
1、清空请求
点击“mitmproxy”,点击“new”,可将所有的请求清空
2、mock Request和Response
(1)筛选mock链接
首先在intercept输入框内输入需要mock的链接,部分链接也可以,只要能过滤到。
(2)拦截请求
在下一次网络请求时会显示已经拦截到了链接,拦截过程有两个暂停,第一次暂停,可以修改Request,如下图所示
第二次暂停可以修改Response数据。
(3)当你清空Intercept内字符串后,就不会再拦截了
四、mitmproxy拦截Https请求
如今很多APP都开始使用Https请求,以确保数据安全,按照以上设计可以拦截Release版APP的https请求,但是Debug版APP的Https请求需要在手机设备上安装mitmproxy的https认证证书。(这个是针对自己开发APP总结的经验,对其他APP不一定适用)
在你的移动设备上打开 http://mitm.it/链接,下载相应证书,然后安装。
Android 手机可以在“设置/安全/从SD卡安装证书”中安装刚才下载的证书。重新链接代理无线网络即可。
结语
mitmproxy是一个非常好的开发辅助工具,帮助开发测试人员很方便的查看网络链接、mock数据,当然,如果你能够自己开发一套自己的mock工具也很好!工具好坏取决于使用者的目的,如果目的不正,即使再好的工具也是负能量,希望大家不要将这么好的工具用在破坏上面。
最后APP开发者一定要注意自己的数据保密性,https也不是万能的,最根本的还是对自己的传输数据进行加密,对于关键数据,特别是支付数据,要做到加密,否则会轻易被他人拦截破解。