# DJudger

在右上角可切换中英文文档 / Switch Chinese and English in the upper right corner

如果有任何问题或建议,欢迎联系@NicerWang (opens new window)或提出Issue

# 项目简介

基于Docker的代码执行容器,目前仅有 Java 版本

通过在项目中使用 DJudger ,您可以为项目添加代码运行能力,且代码运行高效、安全,有一定的并发承载能力,可以兼容各类语言,支持多台机器作为执行机器。

  • 特性: 使用简单 / 可拓展性强 / 安全性高 / 快速响应和分配

如果你想使用 DJudger 作为 OJ 的代码运行器,你可以尝试使用管道符 | 来解决输入问题,目前版本暂时不支持重定向 stdin 。

本项目暂无开发 Spring Boot Starter 的规划。

# 关于本项目的一些思考

在操作系统中,处理死锁问题有三种思路,分别是预防(打破四个必要条件之一)、动态避免、恢复,这里用死锁问题来类比恶意代码防范问题,讨论三种恶意代码防范的方法:

  • 如何实现预防?

    在代码执行之前就需要有能力检测出恶意代码,这是被抛弃的方案,因为C语言的宏定义近乎万能,可以轻松找到破解既有规则的方案,所以这里不进行讨论。但是这部分内容是有价值的,可以作为其他方案的补充。

  • 如何实现动态避免?

    这是现今使用最多的方案,通过 Linux 底层的一些机制,限制程序的系统调用,监控程序的CPU占用率、执行时间、内存占用等信息,对恶意行为进行动态避免。

    这一方案性能较好,但是实现的难度较大,要求了解 Linux 系统的相关知识( ptrace 等),且需要针对不同语言单独给出设计方案,如 C 语言需要预防编译阶段的攻击,但是 Python 语言就不需要。

  • 如何实现恢复?

    这是 DJudger 解决这一问题的方案。通过 Docker 容器来作为沙盒运行代码,可以完全屏蔽不同语言之间的差异,且不需要 Linux 系统相关知识,甚至可以运行在支持 Docker 的任意系统上。对于每种语言,只需要设计一个 Docker 镜像,就能得到一个安全高效的代码执行环境。

# 项目文档索引

# 项目规划

  • 快速入门脚本

  • 针对常见恶意代码的测试

  • 分布式部署模式设计

  • 项目架构介绍

  • Spring 集成

上次更新: 2022年9月26日星期一下午4点45分 GMT+8