1.2项目架构与数据结构

文章目录
  1. 1. 1 源码结构
  2. 2. 2 设备体系
    1. 2.0.1. 2.1 域、实体和关系
    2. 2.0.2. 2.2 功能详述
  • 3. 3 交互逻辑
  • 4. 4 数据库的表结构
    1. 4.0.1. verify表(身份校验表)
    2. 4.0.2. user表(用户表)
    3. 4.0.3. apk表(应用表)
    4. 4.0.4. report表(报告表)
  • 5. 5 数据交换格式(json)
  • 1 源码结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    /-- |
    |-- default 存放用户的默认头像、检测报告的模板、DEMO.apk
    |-- dist 网页的css样式、js、图片和字体等资源
    |-- modules 前端php
    | |-- class 涉及前端动作处理的php
    | |-- ui 前端界面的公共包含页
    |-- php 后端的php,**该部分与前端的代码分离**
    | |-- COS 腾讯云对象存储的SDK
    | |-- file 文件操作相关
    | |-- func smtp发送
    | |-- user 用户操作相关
    | |-- annhub_func.php 函数集合
    | |-- b.php 暂未使用,后期改用https协议的模板
    | |-- conf.php 数据库、smtp等参数配置
    |-- src
    |-- vendors bootstrap内核框架、各类组件、一些js特效
    |-- 404.php 404页面,用于处理页面不存在的错误
    |-- 500.php 500页面,用于处理其他类型的错误
    |-- favicon.ico 浏览器导航栏的图标
    |-- index.php 主页
    |-- information.php 个人信息页面
    |-- login.php 登录页面
    |-- signup.php 注册页面
    |-- manage_index 登陆后的后台管理页面
    |-- my_app.php 我的应用页面

    2 设备体系

    2.1 域、实体和关系

    我们的设备由三大部分组成,我们将其称之为,分别是Web服务器、对象存储服务器和用户,其中Web服务器是在阿里云上搭建的,开发采用前后端分离的模式,对象存储则使用了腾讯云提供的服务,用户是使用PC和移动终端的群体。

    详细的实体说明见下表:

    环境 配置
    Web服务器 阿里云
    前端、后端
    Linux(CentOS 7.3 x64
    apache
    mysql
    PHP
    公网IP 118.89.192.69
    对象存储服务器 腾讯云
    存储桶annhub-1252789527
    地区上海
    https://annhub-1252789527.cos.ap-shanghai.mycloud.com
    用户域 PC
    移动终端
    Andorid
    iOS

    实体和域的关系图

    这里我们规定:

    实体是域中的具体的对象,用形象的图标表示,而实体与实体、实体与域、域与域之间的关系,我们用箭头和大写字母表示。

    • 用户域(包括用户、PC和移动终端)
    • Web服务器(包括前端、后端、MySQL数据库)
    • 对象存储(包括APK文件、扫描报告)

    2.2 功能详述

    • APK的上传、删除和下载

    前端由modules/class/file.php和腾讯云提供的SDKmodules/class/COS来控制,而modules/class/progress.php处理文件上传过程中进度条的显示问题;

    后端由

    php/file_upload_request.php
    php/file_upload_succceed.php
    php/file_delete_request.php
    php/file_delete_succced.php
    

    上传和删除关系的实现过程:A-C-F-G-H-C-D-E-F-B

    用户首先发起上传APK(A)的请求到Web服务器,又前端代理用户向后端发起curl请求(C),后端收到请求后传递给前端一个数据集合(F),里面包含文件名、文件标识和能够获许上传至对象存储COS的凭证等。前端将会根据后端的数据集合,打开上传通道接收用户上传的APK,先将APK文件暂存在服务器,进行校验,并依据后端的信息进行处理后,将文件转移至腾讯云的对象存储服务器(G),并将本地的文件删除。待腾讯云对象存储返回成功的信息后(H),前端便告知后端上传完成(C),由后端完成数据库更新的相应的操作(DE)。完成后,后端告知前端,数据库的相应操作完成(F),最终由前端提示用户,APK文件上传成功(B)。

    删除操作的流程与上传是一样的,只需要将上一段中所有“上传”的关键词替换为“删除”即可。

    下载的实现过程:A-B-I

    用户打开网页,可以直接链接到对象存储文件的URL,完成下载任务。

    • 用户头像的上传

    实现过程同APK的上传和删除

    前端由
    modules/class/file.php和腾讯云提供的SDKmodules/class/COS控制

    后端由

    php/user_head_upload_request.php
    php/user_head_upload_succceed.php
    

    控制

    • 注册、登录和登出

    实现过程:A-C-D-E-F-B

    前端由modules/class/authenticate.php控制

    后端由

    php/user_register.php
    php/user_login.php
    php/user_logout.php
    

    用户在进行注册、登录和登出时,由前端的authenticate.php向后端对应的php发起curl请求(C),由后端进行数据库相应的操作后(DE),告知前端操作完成后(F),由前端负责在进行浏览器端相应的显示(B)。

    • 用户邮箱修改、用户昵称修改、用户密码修改

    原理和关系链同注册、登录和登出

    前端由

    modules/class/user.php
    

    控制

    后端由

    php/user_email_change.php
    php/user_nickname_change.php
    php/user_password_change.php
    
    • 页面数据的填充

    实现过程:A-C-D-E-F-B

    我们可以认为网站根目录下的页面文件(index.php/information.php等)是一个框架,就像没有血肉之躯的骷髅,类似人类的骨架。我们挖开古人的坟墓,看到堆砌的白骨,我们再厉害也没办法想象出死主生前的模样,那是因为没有肉体的点缀,不同人的白骨对于我们来说没有区别,可见一具“皮囊”对我们来说至关重要,甚至是我们独特性的重要组成部分。

    页面的数据就像是我们的皮囊,包括我们的用户名、昵称、密码、通知、消息等等独属于我们的数据,包含了我们存在的印记,而页面文件就像我们的躯壳,提供了一个容纳数据的架子,对不同的用户只需要将不同人的数据从数据库中提取出来,填充在空置的架子上,就完成的显示的任务。

    这项任务由前端

    modules/data.php
    

    来完成,它会向后端的

    php/file/file_info_get.php
    php/user/user_info_get.php
    

    发起curl请求,由后端完成数据的查询任务,返回json格式的数据,经过解码后完成数据的填充,最后展示给用户看。

    3 交互逻辑

    用户的交互逻辑见下方的流程图

    交互逻辑图

    4 数据库的表结构

    所有数据表均采用Innodb,字符编码集为utf8

    verify表(身份校验表)

    Field Type Null Key Default Extra
    email varchar(32) NO PRI NULL
    verification_code char(6) NO NULL
    time bigint(12) NO NULL

    user表(用户表)

    Field Type Null Key Default Extra
    user_id bigint(16) NO PRI NULL auto_increment
    email varchar(32) NO NULL
    password text NO NULL
    token_key char(16) NO NULL
    token_time_end bigint(12) NO NULL
    nickname varchar(16) NO NULL
    head_url varchar(1024) NO NULL
    file_num int(10) unsigned NO NULL
    file_protected_num int(10) unsigned NO NULL
    file_scan_num int(10) unsigned NO NULL
    file_leak_num int(10) unsigned NO NULL
    register_time bigint(12) NO NULL
    register_date varchar(10) NO NULL

    apk表(应用表)

    Field Type Null Key Default Extra 说明
    apk_id bigint(20) NO PRI NULL auto_increment apk的ID
    user_id bigint(16) NO NULL user的ID
    apk_name varchar(1024) NO NULL 唯一识别apk的名称,是一串定长的关于用户邮箱的哈希值
    apk_real_name varchar(32) NO NULL apk的展示名称
    upload_time bigint(12) NO NULL 上传时间,距1970-1-1的秒数
    upload_date varchar(10) NO NULL 上传时间,Y-m-d格式
    upload tinyint(1) NO NULL 上传标志,1完成,0未完成
    protected tinyint(1) NO NULL 加固标志,1完成,0未加固
    scanned tinyint(1) NO NULL 扫描标志,1完成,0未完成
    app varchar(1024) NO NULL 源apk的下载url
    report varchar(1024) YES NULL pdf版报告的url
    app_protect varchar(1024) YES NULL 加固后的apk下载url
    report_protect varchar(1024) YES NULL pdf

    (需要修改源码文件)

    report表(报告表)

    Field Type Null Key Default Extra 说明
    count bigint(20) NO PRI NULL auto_increment
    apk_id bigint(20) NO NULL
    identify char(5) NO NULL
    result text NO NULL
    level tinyint(1) NO NULL

    select result, level where apk_id = XXX and identify = ‘XXX’;

    5 数据交换格式(json)

    前后端数据交换格式(后端由php/python)

    1
    2
    3
    4
    {
    state_message: xxxx //状态码,0为正常,其他的是错误
    data: [] //具体的各种数据
    }

    python的扫描结果返回格式

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    {
    state_message: xxxx
    info:{
    apk_name: //apk的唯一标识(string)
    file_size: //文件大小,单位MB(float)
    md5: //针对apk文件计算的32位的md5散列值(string)
    package_name: //包名(string)
    main_activity: //主活动(string)
    min_sdk: //最小sdk(int)
    target_sdk: //目标sdk(int)
    permission:[{
    {level:'xxx',data:'xxx'},
    {level:'xxx',data:'xxx'},
    ......
    {level:'xxx',data:'xxx'}]
    }] //menifest中的权限内容
    //(level-string,data-string),有顺序要求
    activity: //(string)
    service: //(string)
    broadcast_recv: //(string)
    content_provider: //(string)
    leak:[
    {level:xxx,data:'xxx'},
    {level:xxx,data:'xxx'},
    ......
    {level:xxx,data:'xxx'}]
    } //总共有70项,大小为70的数组
    //(level-string,data-string),有顺序要求
    }

    python返回格式的进一步说明

    permission

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    每个应用申请权限的数量都不尽相同,所以permission的json数组的长度是不固定的,需要遍历manifest文件,取出所有的权限。详细的权限体制说明请参看《扫描项目详述》中的《权限信息检测》。

    level-string类型
    'xxx' //level的返回值请参考《扫描项目详述》中的《权限信息检测》
    //所有权限对应的权限字符串,按照那个值进行返回
    data-string类型
    'xxxx' //权限的字符串,比如ACCESS_NETWORK_STATE

    [注意]
    需要仔细阅读《扫描项目详述》中的《权限信息检测》中的内容。

    leak

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    根据《扫描概述》中《安全指数模型》70项的风险项的扫描情况,将leak设计成为存储70个对象的数组,长度为70,需要注意的逻辑顺序必须与文档中70个风险项的排列顺序保持一致。

    level-string类型-返回以下7种情况中的1种
    'safe' //安全
    'remind' //提醒
    'warning' //警告
    'low' //低危
    'middle' //中危
    'high' //高危
    'NF' //暂时无法实现该项的扫描功能(No Function)
    date-string类型-返回以下2种情况中的1种
    'xxxx' //扫描结果,需要定位具体的漏洞点,描述漏洞发生的位置
    'NULL' //返回'NULL'字符串

    [注意]
    level=safe可以返回'NULL'字符串,或者level=NF也可以返回'NULL',注意不要返回空的内容,而是内容为'NULL'字符串。