GZ::CTF 开发日志
GZ::CTF 开发日记
GZ::CTF 是一个基于 ASP.NET Core 开发的开源 CTF 比赛平台
16 Mar, 2021
今天正式新建文件夹准备开始做这个工作,目标是制作一个用于校内比赛的 CTF Server,参考的代码库主要有H::Judge、hackergame、CTFd以及自己以往开发的有关代码。
下一步计划是做好整体架构设计,明确实现的功能和需求分析。
17 Mar, 2021
今天考虑了一下计分和
flag
验证的方法和系统,做了个基础的设计。MVC 三大块也有了基本的框架,等待讨论和补充。
确认了Hackergame
的几个flag
的末尾 HexCode 是用户特异的,进而可以得到有没有抄袭等现象,这个想法很聪明,借鉴了。18 Mar, 2021
设计好了 GZ::CTF Server 的数据库,做好了 EFCore 的实体关系绑定。
19 Mar, 2021
做好了用户登录,注册以及第一次实现了验证邮件的发送。
推荐将邮件内容作为模板保存,这是我第一次使用”嵌入的资源“,用起来效果很不错。
Identity 比想象中的好用太多了,也不知道之前自己那么畏惧它是因为什么。20 Mar, 2021
和学长一起完善了几个数据对象的属性,如题目的难度、分类等。
探讨了一部分接口的设计方案,完成了找回密码的相关页面和后端设计。21 Mar, 2021
编写了有关 Flag 校验的逻辑,更改了一些代码为更加高效的样子。
22 Mar, 2021
添加了一血的判定和抄袭者的检查,添加了比赛分数的变化,并添加了比赛的“置顶”属性,用以展示主页面,在考虑是否将比赛与数据库分离,独立存放为 Markdown 等。绝大部分代码逻辑已经实现。
25 Mar, 2021
写了超多的代码,也开始做前端了,今天一天都在搞 SignalR,还在搞……
26 Mar, 2021
又写了超多的代码,SignalR 做好了,成功实现了日志主动推送。
给 NLog 添加一个 Target,并且将其初始化时静态存储在 Instance 属性中,然后添加一个 Singleton 的 Service 来保存 SignalR Hub 的上下文,并且让那个 Hub 加载的时候带着这个 Service 实例化,进而实现推送功能。这个过程中翻阅了很久 SignalR 的文档,查了很多博客和 stackoverflow,才终于成功实现 orz
晚上和 GrakePCH 写了很多的前端和交互,持续工作,准备进入最核心功能的实现,另外是时候看看 Markdown 的渲染怎么做了。
27 Mar, 2021
今天大量更新了一些代码,对于 Markdown 的渲染决定使用 Markdig 库进行,同时使用 prismjs 进行前端的代码块渲染,公告的编辑已经实现,同时优化了很多的 UI,继续往前推进。
下一步是比赛的编辑、新建;题目的编辑、新建;广播的删除;通知的增删改查;比赛的显示;排行榜的显示;题目的显示及提交。
对于排行榜,考虑使用 echarts 或者 chartjs 进行阶梯图绘制。排名、通知需要进行利用 SignalR 的实时推送。28 Mar, 2021
今天我本人写了很少量的代码,因为忙于其他事情。添加了比赛的密码访问机制,并且实现了输入一次之后可以自动保存。
GrakePCH 写了不少前端,更新了登录、注册、找回密码等界面的 UI 样式。28 Mar, 2021
因个人原因,计划停止开发两天,进行调整。
31 Mar, 2021
添加了广播的发布按钮、做了一些架构调整和优化,开始着手制作比赛详情页面的内容,Moke 和比赛的密码验证做了微调,测试了多端同时推送信息的效果。
1 Apr, 2021
测试了 Docker 部署的可行性,写了 Dockerfile,在阿里云容器服务上测试了一下。
2 Apr, 2021
题目列表的 UI 完工了,于是我也顺便将它的后端和适配完工了。
晚上改进了一些代码,顺便把比赛密码 key 的明文显示改为了用户特异的一串 Hex。3 Apr, 2021
完工题目编辑界面的 UI,去除比赛的 Announcement 表,减少工作量。
6,7 Apr, 2021
拿到了服务器。问题众多,解决了大半,还剩几个问题待解决。
12 Apr, 2021
更新了部分的样式以及页面布局。
20 Apr, 2021
实现了 Ed25519 签名算法的实用性实验,准备学习 hackergame 的相关逻辑进行 Token 签发。
移除了用户 Token 的显示和生成,现在用户 Token 为 8 位字符串。
针对不同比赛生成一对不同的公私钥,利用私钥签名 Token,并在附属服务器利用公钥进行权限验证。想了很久中间应该用什么分隔符,最后还是用了
.
来做,我也不知道为什么(
目前公私钥是在比赛数据库中以 Base64“明文”存储,考虑通过 appsettings 里面添加一个字段来实现私钥的加密存储。用户的 Token 存放在 Rank 对象中,实现了 Rank 对象随着用户进入比赛而生成。在比赛界面显示用户签名后 Token。
21 Apr, 2021
添加了一个基于 Python 的签名验证示例。
为一些意料之外的异常添加了 throw。
期中考试等事情过多,暂时停更。