我们学校的 Online Judge 开源了,基于 Python 和 Docker, https://github.com/QingdaoU/OnlineJudge ,求 star - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
virusdefender
V2EX    分享创造

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

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

    每个学校 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
      &bsp; 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  
       205-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     Solana     2674 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 07:12 PVG 15:12 LAX 00:12 JFK 03:12
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86