本项目的设计,放弃了C/S系统,而是采用B/S系统,即浏览器/服务器系统。之所以采用B/S的体系结构,主要考虑到系统的方便性,用户无需安装客户端即可使用该系统,这样给本系统的用户减少了很多不必要的麻烦,而且方便对系统进行更新维护。使用的框架主要是Mybatis+Spring+SpringMVC框架,即当今较为流行的SSM框架,SSM框架基于MVC模型。MVC模型的结构包括Model模型层,View视图层,Controller控制层。在线答题平台的架构主要分为6个层次,包括前端UI、展示层、业务层、数据层、数据库和运行环境,如下图为系统的系统架构图:
本系统搭建时选用时选用Java作为开发语言,采用SSM框架,前端我们暂定html+css+JavaScript开发,后续使用什么框架待定。同时,本项目的一个重难点是分布式独立靶机的搭建,因为CTF中的web方向与PWN方向的答题环节需要搭建在在线环境中,每个用户要去答题,则需要生成一个独立的在线环境,各用户之间的操作不会影响到别人的在线环境,用户最终要从在线环境中抽丝剥茧找到最终的答案即flag,这就需要到了分布式独立靶机,
本项目决定使用Docker技术进行分布式独立靶机的搭建。如下图所示,docker比传统虚拟机更加轻便,传统虚拟机启动耗时为分钟级别,而Docker容器启动仅为秒级别,这极大的提高了用户体验。且每个容器相互隔离,每个容器都有自己的文件系统,容器之间进程不会相互影响,能够给不同的用户提供不同的环境,使得相互之间的操作互不干扰。Docker实现了“一次构建、随处运行”,因此我们可以将用户所需的靶机环境封装进入一个镜像,当发出靶机构建请求时,便会构建该镜像的实例即容器,进而成功搭建靶机环境。
综上,本项目各项技术与工具选择如下:
因为本系统采用B/S系统,因此用户通过web浏览器便可使用我们的系统。
本系统采用B/S架构,系统提供给用户的接口WEB API如下图所示:
本系统采用MVC框架,下图展现了软件模块之间的依赖关系与MVC模型的逻辑流。
名称 |
中文 |
CTF学习平台设计与实现 |
||
英文 |
Design and implementation of CTF learning platform |
|||
项目成员 |
姓名 |
学号 |
项目中的分工 |
|
杨** |
SA2022**** |
分布式独立靶机搭建,前端编写 |
||
余* |
SA2022**** |
后端搭建,系统测试 |
属性名 |
类型 |
是否可为空 |
描述 |
user_id |
integer |
N |
用户编号 |
username |
varchar |
N |
用户名 |
nickname |
varchar |
N |
昵称 |
password |
varchar |
N |
密码 |
sex |
varchar |
Y |
性别 |
|
varchar |
Y |
邮箱 |
telephone |
varchar |
Y |
手机号 |
school |
varchar |
Y |
学校 |
introduction |
varchar |
Y |
个人简介 |
user_points |
integer |
N |
用户积分 |
solved_problems |
integer |
N |
解题数 |
user_images |
varchar |
N |
用户头像 |
team_id |
integer |
Y |
队伍编号 |
属性名 |
类型 |
是否可为空 |
描述 |
problem_id |
integer |
N |
题目编号 |
problem_titile |
varchar |
N |
题目标题 |
difficulty |
integer |
N |
难度系数 |
problem_description |
varchar |
N |
题目描述 |
problem_scene |
varchar |
Y |
题目场景 |
problem_appendix |
varchar |
Y |
题目附件 |
problem_answer |
varchar |
N |
题目答案 |
problem_points |
varchar |
N |
题目积分 |
problem_type_id |
integer |
N |
题目类型编号 |
problem_area |
varchar |
N |
题目区域类型 |
属性名 |
类型 |
是否可为空 |
描述 |
answer_id |
integer |
N |
用户答案编号 |
user_id |
integer |
N |
用户编号 |
problem_id |
integer |
N |
题目编号 |
answer_content |
varchar |
N |
答案内容 |
answer_time |
time |
N |
解题时间 |
属性名 |
类型 |
是否可为空 |
描述 |
contest_id |
integer |
N |
竞赛编号 |
contest_title |
varchar |
N |
竞赛主题 |
sponsor |
varvhar |
N |
主办方 |
start_time |
time |
N |
竞赛开始时间 |
end_time |
time |
N |
竞赛结束时间 |
contest_introduction |
varchar |
Y |
竞赛介绍 |
team_nums |
integer |
N |
参赛队伍数 |
属性名 |
类型 |
是否可为空 |
描述 |
team_id |
integer |
N |
队伍编号 |
team_name |
varchar |
N |
战队名称 |
leader_id |
integer |
N |
队长id |
team_nums |
integer |
N |
战队人数 |
team_points |
integer |
N |
战队积分 |
team_create_time |
time |
N |
战队创建时间 |
属性名 |
类型 |
是否可为空 |
描述 |
goods_id |
integer |
N |
商品编号 |
goods_name |
varchar |
N |
商品名 |
goods_points |
integer |
N |
商品所需积分 |
goods_stock |
integer |
N |
商品库存 |
goods_offer |
varchar |
N |
商品提供方 |
属性名 |
类型 |
是否可为空 |
描述 |
explanation_id |
integer |
N |
题解编号 |
explanation_content |
varchar |
N |
题解内容 |
problems_id |
integer |
N |
题目编号 |
user_id |
integer |
N |
发布者编号 |
explanation_time |
varchar |
N |
发布时间 |
项目源代码的目录文件结构如下图所示:
项目名称为ctfplatform,main目录向下细分为如下几个目录:
java.cn.ctf(存放后端代码)
webapp(存放前端代码)
resources(存放配置文件)
External Libraries目录:存放依赖包。
原文:https://www.cnblogs.com/yxy0323/p/14197071.html