一、软件设计方案

本学期工程实践需要完成ctf赛题学习与安全工具分享平台的搭建。我们准备使用MVT框架进行设计。

MVT与MVC不同,M代表midel,负责与数据库交互;V表示view,是核心,负责接受请求、获取数据与返回结果;T表示template,负责呈现内容到浏览器。

如图:

 

 客户端先是请求信息,然后交给视图函数处理。当需要数据的时候调用model,请求数据库拿到信息,再返回给视图处理。

其特点就是在模型model中不需要编写任何sql语句,这是相当友好的。在关系数据库中的一行,就相当于model中的一个对象。

在关系数据库中的一个表,相当于一个对象的集合。在python中用列表定义关系数据库中的一个表,我们直接在对象中写列表的操作就可以了,ORM会转换成sql语句。之后我们得到一个列表对象返回给视图View。

视图View会进行一些处理,比如登陆:需要在数据库中查询密码,查完之后返还给视图做判断处理,处理的结果需要用模板Templates呈现(渲染HTML和CSS执行JS),然后返回客户端。

 

二、接口API

注册 user_register() 进行参赛者和管理员的注册 传入用户名与密码等基本信息并记录
登录 user_login() 用户进行登录 传入用户名与密码进行校验
请求writeup get_one_wp() 根据请求返回对应的writeup 传入request
新增writeup add_wp() 根据请求在对应用户下新增writeup 传入request
查看个人writeup self_wp() 根据请求查看个人writeup并按时间排序 传入request
 删除writeup
delete()
 根据请求中的id号删除对应writeup  传入request
修改时wp副本
edit_wp()
根据id查找对应的博客并展示这个博客的title和content,但还没有修改 传入request与id
修改wp
edit_post_save()
在edit_wp()调用后修改,根据request中的内容修改指定博客 传入request
判断地址合法性
is_valid_email()
判断注册时邮箱地址是否合法 传入邮箱地址字符串
头像更新
upload_avatar()
从request中获取上传的头像图片文件,对用其来更新对应用户的头像 传入request
链接工具集
add_tools()
获取用户上传工具链接(安全性不足,待更改) 传入request
下载工具集
download_tools()
根据用户请求的id跳转至对应url(安全性不足,待更改) 传入request和id

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

三、依赖视图

依赖视图展现了软件模块之间的依赖关系。比如一个软件模块A调用了另一个软件模块B,那么我们说软件模块A直接以来软件模块B。如果一个软件模块依赖另一个软件模块产生的数据,那么这两个软件模块也具有一定的依赖关系。

就MVT框架而言,各模块的依赖关系就如上文所示,不再赘述。

但具体而言各模块之间的依赖关系可以很好的通过类图来表达:

 

 四、面向功能分解视图

 

 

 

 

五、部署视图

部署视图是将执行实体和计算机资源建立映射关系。这里的执行实体的粒度要与所部署的计算机资源相匹配,比如以进程作为执行实体那么对应的计算机资源就是主机,这时应该描述进程对应主机所组成的网络拓扑结构,这样可以清晰地呈现进程间地网络通信和部署环境的网络结构特点。当然也可以用细粒度地执行实体对应处理器、存储器等。

部署视图有助于设计人员分析一个设计的质量属性,比如软件处理网络高并发的能力、软件对处理器的计算需求等。

一般的部署视图如下:

 

 若有在线多人同台比赛的需求,可能需要高并发服务器以及多库多表的支持:

 

 

六、执行视图

执行视图展示了系统运行时的时序结构特点,比如流程图、时序图等。执行视图中的每一个执行实体,一般称为组件,都是不同于其他组件的执行实体。如果有相同或相似的执行实体那么就把他们合并成一个。

执行实体可以最终分解到软件的基本元素和软件的基本结构,因而与软件代码具有比较直接的映射关系。在设计与实现过程中,我们一般将执行视图转换为伪代码之后,再进一步转换为实现代码。

 

 以参赛者的角度:

 

 以管理员的角度:

 

 

 

 

七、数据库设计

 管理员表:

名称 类型 注释
userId int 管理员Id

userName

varchar 管理员名称
password varchar 管理员密码

 

 

 

 

 

 

 

参赛者表:

名称 类型 注释
userId int 参赛者Id
userName varchar(10) 参赛者昵称
password varchar(20) 参赛者密码
portrait varchar() 参赛者头像的存储路径
gender bool 参赛者性别

 

 

 

 

 

 

 

 

问题表:

名称 类型 注释
questionId int 赛题Id
category varchar(10) 赛题分类

 

 

 

 

 

安全工具表:

名称 类型 注释
toolName varchar(10) 安全工具名称
category varchar(10) 安全工具分类
downloadUrl varchar() 安全工具下载链接

 

 

 

 

 

 

评论表:

名称 类型 注释
commentId int 评论Id
writeUp int 该评论所属的writeup的id
user int 评论者id
addTime bigint 评论发布时间
content text 评论内容

 

 

 

 

 

 

 

 

writeup信息表:

名称

类型

注释
writeUpId int writeup的Id
question int 所属问题id
visit int 访问量
addTime bigint 发布时间
content text 内容
uesr int 发布者
title varchar(20) 标题
tools varchar 安全工具下载链接

 

 

 

 

 

 

 

 

 

 

 

 

八、实现试图

实现视图是描述软件架构与源文件之间的映射关系。比如软件架构的静态结构以包图或设计类图的方式来描述,但是这些包和类都是在哪些目录的哪些源文件中具体实现的呢?一般我们通过目录和源文件的命名来对应软件架构中的包、类等静态结构单元,这样典型的实现试图就可以由软件项目的源文件目录树来呈现。

后端:

前端:

 

 

 

 

 

九、运行环境与核心工作机制

语言:python3.7为主

框架:vue & django 为主

数据库:mysql5.7(考虑使用更加方便的MongoDB,获得更好的代码亲和性。)

IDE:pycharm & vscode

 

用户经过注册后成为参赛者,可以进行赛题的查看与解答,提交writeup,并附上自己使用的安全工具链接以供分享。

同时参赛者可以查看其他用户的writeup以及工具集,并进行评论或下载。

管理原则是具有管理赛题、评论与writeup的权限。