1 源码结构
1 | /-- | |
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 |
---|---|---|---|---|---|
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 |
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 |
(需要修改源码文件)
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 | { |
python的扫描结果返回格式
1 | { |
python返回格式的进一步说明
permission1
2
3
4
5
6
7
8
9
10每个应用申请权限的数量都不尽相同,所以permission的json数组的长度是不固定的,需要遍历manifest文件,取出所有的权限。详细的权限体制说明请参看《扫描项目详述》中的《权限信息检测》。
level-string类型
'xxx' //level的返回值请参考《扫描项目详述》中的《权限信息检测》
//所有权限对应的权限字符串,按照那个值进行返回
data-string类型
'xxxx' //权限的字符串,比如ACCESS_NETWORK_STATE
[注意]
需要仔细阅读《扫描项目详述》中的《权限信息检测》中的内容。
leak1
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'字符串。