一、软件设计方案
本学期工程实践需要完成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的权限。