V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
virusdefender
V2EX  ›  分享创造

我们学校的 Online Judge 开源了,基于 Python 和 Docker, https://github.com/QingdaoU/OnlineJudge ,求 star

  •  1
     
  •   virusdefender ·
    virusdefender · 2015-09-17 17:06:17 +08:00 · 20508 次点击
    这是一个创建于 3347 天前的主题,其中的信息可能已经有所发展或是发生改变。

    每个学校 ACM 队在训练或者招生的时候可能都需要一个 oj ,我们常用的 oj 是杭电的,但是有些不是很满意的地方。

    首先是界面,国内的 oj 除了 pat 、 codevs 等大多数都很丑很丑, 10 多年前的风格,可能因为 oj 就是 10 年前写的吧。

    用起来也有些不是很方便的地方,比如提交题目要新开页面,要再选择题号,再手动刷新看结果。自己内部比赛有些规则也没办法去设置,自己没法去添加题目去查看测试用例等等。

    所以我们实验室三个人用了大约暑假一个半月的时间,自己写了一个 oj ,我们的定位不仅仅是 ACM 训练,还有学校平时教学的作业考试等也可以在上面进行。 老师作为普通管理员可以创建小组,相当于一个班级,内部举办比赛,创建修改题目,外人不可见,超级管理员才可以管理公开的题目和比赛。

    后端涉及到的技术有 Python 、 Django 、 Docker 、 MySQL 、 Redis 、 Celery 等,后台的前端是一个 SPA 页面,使用 avalon js 。

    GitHub: https://github.com/QingdaoU/OnlineJudge (顺手 star 一个吧~)

    文档: https://www.zybuluo.com/virusdefender/note/171932

    demo: https://qduoj.com

    给大家提前注册了账号,用户名 V2EX (都是小写的,论坛会自动转换为大写),密码 123456 ,欢迎去试用一下。

    有什么问题或者建议欢迎在下面回复。

    谢谢啦~

    第 1 条附言  ·  2015-09-17 18:13:46 +08:00
    判题临时关了,楼主正在抓紧写 todo 掉的安全机制,么么哒~
    第 2 条附言  ·  2015-09-17 20:15:04 +08:00
    已经增加了部分系统调用的过滤
    第 3 条附言  ·  2016-04-02 22:50:11 +08:00
    56 条回复    2020-02-08 01:16:32 +08:00
    hcymk2
        1
    hcymk2  
       2015-09-17 17:12:59 +08:00
    我怎么 star 过?
    Nan7Huang
        2
    Nan7Huang  
       2015-09-17 17:19:19 +08:00
    哦~厉害~我要推荐给队友
    maemual
        3
    maemual  
       2015-09-17 17:47:39 +08:00
    不好意思。。。似乎被我一个 fork 炸弹就玩挂了。。。
    elvodn
        4
    elvodn  
       2015-09-17 17:49:56 +08:00
    @maemual 真会玩
    maemual
        5
    maemual  
       2015-09-17 17:52:58 +08:00
    @elvodn 作为同样写过 OJ 的人,看到用 Docker 判题就知道八成没处理这种问题。。。
    virusdefender
        6
    virusdefender  
    OP
       2015-09-17 17:53:02 +08:00
    @maemual 额 我看到了 现在系统调用过滤还是 todo 的状态。。
    virusdefender
        7
    virusdefender  
    OP
       2015-09-17 17:54:15 +08:00
    @maemual docker 里面跑的 https://github.com/quark-zju/lrun docker 只是用来方便隔离环境用的,只是 lrun 的系统调用过滤我还没写
    wph95
        8
    wph95  
       2015-09-17 17:54:27 +08:00
    > 国内的 oj 除了 pat 、 codevs 等大多数都很丑很丑
    赞的不能再多

    整体写的非常好

    部分代码有待商榷 比如:
    contest_submission 和 submission 可以和到一起的


    评测机代码问题很严重 , 这个等下私聊告诉你 , 已经看出起码 3 种方式搞坏 。
    个人还是推荐 不开源 评测机 , 或者集成 hustoj 的评测机(虽然渣的厉害 , 但是安全) 或者给等即将开放的 CodeVS 的评测 API :)
    maemual
        9
    maemual  
       2015-09-17 17:55:44 +08:00
    还有, Django 的 settings 里的 SECRET_KEY ,开源出来会有安全隐患的。
    wph95
        10
    wph95  
       2015-09-17 17:57:26 +08:00
    @virusdefender 不能隔 fork 的 隔了 fork () , 会让 java 性能锐减 , lrun 我记得有个参数的 开启那个参数就可以防止 fork 炸弹,
    没记错应该是 --isolate-process
    virusdefender
        11
    virusdefender  
    OP
       2015-09-17 18:00:40 +08:00
    @maemual 这个只有在 signed cookie 里面用到吧,如果用了 signed cookie 会有问题的。
    virusdefender
        12
    virusdefender  
    OP
       2015-09-17 18:01:33 +08:00
    @wph95 嗯~代码中就可以看到 lrun 的那些参数都是 todo 的状态~docker 隔离性也有问题
    maemual
        13
    maemual  
       2015-09-17 18:02:31 +08:00
    @wph95 可以交流一下评测机的安全机制么。
    learnshare
        14
    learnshare  
       2015-09-17 18:03:02 +08:00
    为什么感觉山东的 ACM 搞得比较热闹
    wph95
        15
    wph95  
       2015-09-17 18:15:05 +08:00
    @maemual
    CodeVS 的核心技术都在评测机了 233
    安全部分 还是传统做法 不过没用 ptrace ( ptrace 太傻 x )
    我原来也是用 lrun (Orz quake ) , 不过和 docker 无法兼容 就放弃了 , 自己写了一套 , 正努力的和整个 docker 生态融合 。

    还有就是 动态弹性的评测集群 , 这个有很多花式解决方案 。

    ---

    有兴趣可以多多交流 , 也可以使用 codevs 的 开放 api 。 已经接受近 300 万次代码提交的检验 , 2 台单核 1g 机器就能承受年百万次评测哦 :—) 。 即将开放 平时 2 路, 峰值 10 路评测 的集群给大家用:)
    maemual
        16
    maemual  
       2015-09-17 18:27:44 +08:00
    @wph95 API 文档在哪?
    breeswish
        17
    breeswish  
       2015-09-17 19:06:47 +08:00
    安利一个久经考验(经过多位就职于国内著名安全实验室小伙伴测试)的,基于 Windows Sandbox 的评测机( from Vijos )

    https://github.com/iceboy-sjtu/winjudge
    iniwap
        18
    iniwap  
       2015-09-17 19:15:41 +08:00
    @wph95 OJ 是 Online Judge 系统的简称,用来在线检测程序源代码的正确性。著名的 OJ 有 TYVJ 、 RQNOJ 、 URAL 等。国内著名的题库有北京大学题库、浙江大学题库、电子科技大学题库、杭州电子科技大学等。国外的题库包括乌拉尔大学、瓦拉杜利德大学题库等。
    Delbert
        19
    Delbert  
       2015-09-17 20:17:53 +08:00 via Android
    @learnshare 山大 7 年表示不知道 acm 是啥
    wph95
        20
    wph95  
       2015-09-17 20:37:44 +08:00
    @maemual 还在实现中 可以 mail [email protected] 交流
    ChiangDi
        21
    ChiangDi  
       2015-09-17 21:34:05 +08:00
    哎哟不错哦,支持
    virusdefender
        22
    virusdefender  
    OP
       2015-09-18 10:08:56 +08:00 via Android
    @learnshare 可能是高考遗留问题。。但是成绩不好
    tuteng
        23
    tuteng  
       2015-09-18 19:00:19 +08:00
    好炫呢
    Changxu
        24
    Changxu  
       2015-10-10 23:16:41 +08:00
    docker 最近新加入了一个特性,是--kernel-memory 参数,据说可以用来解决 fork 炸弹问题: https://github.com/docker/docker/issues/6479

    另外,常见的攻击 OJ 的手段都有什么?
    virusdefender
        25
    virusdefender  
    OP
       2015-10-11 11:48:30 +08:00
    @Changxu 调用各种命令 删除修改文件 fork 占用大量内存 include </dev/random>等
    virusdefender
        26
    virusdefender  
    OP
       2015-10-11 11:49:03 +08:00
    @Changxu 我在系统调用上限制了一下,直接 fork 应该不行了,其余的我也不会写。。
    nisekoi
        27
    nisekoi  
       2015-10-13 12:20:23 +08:00
    已 star..不过按照文档配置了一下,返回 Server Error (500),不清楚是什么问题
    virusdefender
        28
    virusdefender  
    OP
       2015-10-13 12:39:22 +08:00
    @nisekoi 看日志
    nisekoi
        29
    nisekoi  
       2015-10-13 18:37:30 +08:00
    @virusdefender 已解决。说说我遇到的问题:
    提示 TemplateDoesNotExist: oj/index.html
    将 /qduoj/template/src 中的 src 改为 release

    可以访问后静态文件没显示出来?
    由于我把静态文件放在了 /root/下,换到其他目录即可
    virusdefender
        30
    virusdefender  
    OP
       2015-10-13 19:31:06 +08:00
    @nisekoi 你是不是没设置环境变量啊,会判断环境变量来决定配置文件的,一个是 src 一个是 release 。

    要不你就是没打包 js , python tools/release_static.py 就行,这个时候会生成 release 目录。

    不打包的话文件很大,有的页面 1M 多。
    nisekoi
        31
    nisekoi  
       2015-10-13 20:08:10 +08:00
    @virusdefender oj_env 么,那应该是没有设置环境变量了
    junnplus
        32
    junnplus  
       2015-10-17 10:06:28 +08:00
    我们学校也在开发新的 OJ ,测试地址 http://oj.sdutacm.org 目前功能还没写完
    virusdefender
        33
    virusdefender  
    OP
       2015-10-17 10:31:38 +08:00
    @junnplus looks great~
    junnplus
        34
    junnplus  
       2015-10-17 11:27:45 +08:00
    virusdefender
        35
    virusdefender  
    OP
       2015-10-17 11:49:16 +08:00
    @junnplus http://oj.sdutacm.org/u/1/ 我们也在写这样一个个人主页,仿 github
    virusdefender
        36
    virusdefender  
    OP
       2015-10-17 12:45:55 +08:00
    @junnplus 看了下你们的后台,也是 django 的?
    junnplus
        37
    junnplus  
       2015-10-17 13:54:07 +08:00
    @virusdefender 后端是 flask
    junnplus
        38
    junnplus  
       2015-10-17 13:54:50 +08:00
    @virusdefender 方便的可以交流下,微信 jun_nplus
    kzzhr
        39
    kzzhr  
       2015-10-18 00:15:33 +08:00 via iPhone
    作为一个折腾过 oj 的人。挺支持这样做的。
    不过有一些个人看法,浙大在很多年前开源了一个判题的 core ,我觉得其实够用了。并没有必要去用 docker 从头搞。但是其他地方,我们称之为用户体验吧,确实应该改一改。功能上很多不足,应该才是需要花很多精力的
    snnn
        40
    snnn  
       2015-10-18 01:04:20 +08:00 via Android
    直接刷 UVA 什么的不好吗?
    virusdefender
        41
    virusdefender  
    OP
       2015-10-18 06:11:18 +08:00 via Android
    @kzzhr 你是说 lrun 么,我们用到了那个, docker 只是一个壳
    virusdefender
        42
    virusdefender  
    OP
       2015-10-18 06:11:43 +08:00 via Android
    @snnn 自己考试测评比较方便
    Omitted
        43
    Omitted  
       2015-10-18 09:20:07 +08:00
    信工大二,对 python 感兴趣,请问加入学习嘛 0.0
    virusdefender
        44
    virusdefender  
    OP
       2015-10-18 10:27:11 +08:00
    @Omitted 青大的?
    Omitted
        45
    Omitted  
       2015-10-18 10:36:41 +08:00
    @virusdefender 是的, 14 级软外
    Omitted
        46
    Omitted  
       2015-10-18 10:45:29 +08:00
    @virusdefender 对 Python 和 Docker 都感兴趣,不过仅仅算是知道吧,想深入学习,但没有方向,学长能否带走😶
    virusdefender
        47
    virusdefender  
    OP
       2015-10-18 10:50:56 +08:00
    jzp113
        48
    jzp113  
       2015-12-14 16:45:50 +08:00
    哈哈 用 python 写的也支持下 python 在线编译吧
    virusdefender
        49
    virusdefender  
    OP
       2015-12-14 17:24:47 +08:00
    @jzp113 acm 没用 Python 的,所以就没加
    samhjn
        50
    samhjn  
       2016-01-05 18:15:51 +08:00
    @wph95 其实很多年以前 CodeVS ( WikiOI )的评测机也是不安全的。当年他们的安全控制还是字符串匹配。最后我用了伪汇编调用 fork 把服务器整个搞瘫了。
    wph95
        51
    wph95  
       2016-01-05 22:17:21 +08:00
    @samhjn
    当年我还在高中 没有接手 用了某傻 x 开源 judge 方案
    改名 codevs 后就换新的 judge 了 欢迎测试
    felix021
        52
    felix021  
       2016-01-31 21:53:19 +08:00
    写 OJ 的人真多……我想找个能跑 PHP 的,我之前写的那个 Judge 完全是基于 ptrace 限制系统调用,这个对付 PHP 的话很不灵活。
    virusdefender
        53
    virusdefender  
    OP
       2016-01-31 22:00:41 +08:00
    @felix021 PHP Python 之类的语言真没经验,因为很难确定那是解释器的行为还是代码的行为...

    而 Java 还自带一个安全策略呢
    felix021
        54
    felix021  
       2016-02-01 10:02:03 +08:00
    @virusdefender 我是从最小权限开始,一点一点尝试,一点一点放开,直到把必须权限都放开为止。
    xiaoqiang179
        55
    xiaoqiang179  
       2018-05-05 19:06:28 +08:00
    支持学长!!!
    bulabean
        56
    bulabean  
       2020-02-08 01:16:32 +08:00
    支持,厉害了。
    oj.youdao.com 好像,简直一毛一样。我觉得他们用的你这个开源
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1069 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 22:57 · PVG 06:57 · LAX 14:57 · JFK 17:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.