GZ::CTF 开发日记

GZ::CTF是一个基于ASP.NET Core开发的开源 CTF 比赛平台

  • 16 Mar, 2021

    今天正式新建文件夹准备开始做这个工作,目标是制作一个用于校内比赛的 CTF Server,参考的代码库主要有H::JudgehackergameCTFd以及自己以往开发的有关代码。

    下一步计划是做好整体架构设计,明确实现的功能和需求分析。

  • 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。

期中考试等事情过多,暂时停更。