zoukankan      html  css  js  c++  java
  • mitmproxy实践

    首先附上github地址:https://github.com/mitmproxy/mitmprox,上面的内容永远是最新的

    1. 作为一名测试穿戴设备相关app的工程师,与数据打交道是常事,那么,如果想要获取app上传给服务器的文件,怎么获取?
      上传文件,http请求头header的Content-Type字段multipart/form-data
      注意:如果要修改请求参数,必须得了解Content_Type的类型,Content_Type主要告知请求的消息主要用了何种编码,常见3中类型:

    application/x-www-form-urlencoded
    form形式,提交的数据按照 key1=val1&key2=val2 的方式进行编码
    application/json
    JSON编码方式,消息主体是序列化后的 JSON 字符串
    multipart/form-data
    主要是传输二进制流等,boundary区分普通文件内容和二进制流内容
    def request(flow: http.HTTPFlow) -> None:
    target=["/course/data/save"]
    url_path = flow.request.path
    print("完整收到请求(包括body部分)={}".format(url_path))
    if url_path.split("?")[0] in target:
    ctx.log.info("#"50)
    ctx.log.info("课程接口")
    ctx.log.info(flow.request.url)
    fp=open("courseData.dat","wb")
    for key,value in flow.request.multipart_form.items():
    print(key)
    if key==b"courseData":#文件名
    fp.write(value)
    fp.close()
    2. 接口返回字段变更,为了兼容,暂时未去掉,未来去掉,这种情况下,app需要做好兼容性测试,那么需要通过模拟删除相应字段
    def response(self,flow: http.HTTPFlow) -> None:
    if flowfilter.match(self.filter, flow):
    url_path = flow.request.path
    if "
    由于隐私该处省略" in url_path:
    ctx.log.warn("#" * 60)
    res=json.loads(flow.response.text)
    for i in res.get("data"):
    i.pop('happenDate')#删除happenDate字段,这个地方得看返回内容的结构
    flow.response.set_text(json.dumps(res))
    3. 笔者测试的app在header中需要带上一段自定义的字段,当中途新增接口,有时候后开发会忘记添加,那么,测试人员在测试迭代需求的时候,需要检查一遍新增接口请求,阅读完接口后可编写脚本,待发布app时直接执行
    def request(self,flow: http.HTTPFlow) -> None:
    if url_path.split("?")[0] in "
    特定接口*":
    ctx.log.warn("#" * 60)
    dict_obj = json.loads(flow.request.headers.get("selfHeader","{}")) # 字典字符串,headers为字典对象
    4.自定义options
    默认options:
    https://docs.mitmproxy.org/stable/concepts-options/

    自定义filter

    def load(self, loader):
    """
    脚本载入时执行,对应--options参数,默认有多个可供选择的项,如flow_detail,同时可在载入脚本时自定义选项
    option格式:(name,typespec,defult,help)
    """
    loader.add_option("filter", str, "", "过滤规则")

    def configure(self,updated):
    """脚本载入,读取配置"""
    self.filter =flowfilter.parse(ctx.options.filter) #得到一个过滤器

    def request(self,flow: http.HTTPFlow) -> None:
    if flowfilter.match(self.filter, flow):
    print("filter")
    结语
    在使用fitler这个过滤功能时,发现源代码有一处错误,如

    class FDomain(_Rex):
    code = "d"
    help = "Domain"
    flags = re.IGNORECASE
    is_binary = False

    @only(http.HTTPFlow, websocket.WebSocketFlow)
    def __call__(self, f):
        if isinstance(f, websocket.WebSocketFlow):
            f = f.handshake_flow
        return bool(
            self.re.search(f.request.host) or
            self.re.search(f.request.pretty_host) #这里应该添加str,否则一直报错,其他地方类似
        )
    

    作者:小蜗牛的成长
    链接:https://www.jianshu.com/p/23fe9858b2bb
    來源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    为什么button在设置标题时要用一个方法,而不像lable一样直接用一个属性
    桥接模式(透传模式)和直驱模式
    vb.net版机房收费系统——教你七层架构(三)—外观模式
    Android 4.4 KitKat NotificationManagerService使用具体解释与原理分析(二)__原理分析
    poj-2758 Checking the Text
    一种感悟,为什么努力了确还是死了一地
    一位程序员的6年总结(转)
    主键生成策略
    Linux下的crontab定时执行任务命令详解
    win7 64下安装mysql-python报错的解决办法
  • 原文地址:https://www.cnblogs.com/c-x-a/p/9753575.html
Copyright © 2011-2022 走看看