日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

在线判题系统hustoj的搭建

發布時間:2024/4/17 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在线判题系统hustoj的搭建 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

摘要:ACM/ICPC程序設計競賽,越來越受到各個高校的重視,是程序設計競賽中的奧林匹克。Hustoj是搭建在linux系統上的判題系統。能夠判斷代碼的正確性。會及時返回通過或者不通過,如果不通過會返回具體原因。所以這個系統很適合ACM隊員在上面做一些練習。每個學校有必要有自己的OJhustoj雖說是開源,有搭建教程。但是在搭建過程中還是會有一些問題。所以針對這些問題,給出了我的解決辦法。

ACM/ ICPC programming competition, more and more attention by variouscolleges and universities, is the design competition in the OlympicGames. Hustoj is built on the linux system on the problem system.Able to determine the correctness of the code. Will be returned intime or not through, if not passed will return to specific reasons.So this system is very suitable for ACM players in the above to dosome practice. Each school need to have their own OJ, hustoj althoughit is open source, there are structures tutorial. But in the processof building or there will be some problems. So for these questions,given my solution.


關鍵字:在線判題系統hustoj搭建OJlinux搭建OJ


引言


ACM比賽越來越受到高校重視,這是一個能夠提高大學生編程能力的好平臺。各個學校的ACM隊員都需要在自己的OJ上刷題,做練習,還需要出題,因為出題能夠很好的鍛煉一個人,思維能力。如果你能出題說明你對這個知識點理解比較透徹,而不是直接敲的模板(照著代碼抄上去的)。除此之外,每個高校也會不定期的舉辦校賽,什么的,舉辦校賽,很多比賽普遍用的是PC^2,對于用過PC^2的人來講,還可以。不過這個用軟件容易不小心交錯文件。在線判題系統這類問題會相對比較少,其次,在線判題系統的搭建過程也比PC2簡單一點。流程少,如果懂一點php還可以添加一些小功能。Hustoj是開源項目。舉辦比賽是沒什么問題的。大型比賽也沒什么問題。因為他有遠程判題,多臺機器進行判題任務。雖說網上博客也很多,但是實際在弄的過程也會出現很多問題。所以本文主要說說搭建hustoj過程,以及常見問題。以及簡單的說說如何使用。讓學校舉辦比賽變得容易一點。目前沒找到hustoj的開發文檔,這樣不利于二次開發,說一說該項目結構,一邊后人開發有所參考。



  • 安裝流程

  • 1.1系統要求

    該項目是運行在linux系統上的,所以必要的環境是需要一臺linux電腦。對于沒有linux電腦的,可以將一臺windows裝成ubuntu系統,具體如何裝可以參考百度上面的教程,推薦使用hustoj的鏡像,方便易用。裝系統就不多說了,網上教程很多。隨便找一個。

    1.2軟件環境需要

    到此,假設系統已經裝好了。現在需要安裝一些hustoj的一些必須的軟件。因為hustoj的開發者是使用php+mysql,所以這些環境是必須需要的。由于linux文件的權限比較安全,如果是新手會遇到很多問題,如果只是短期比賽,局域網的比賽那么用root賬戶是沒什么大問題的。如果是搭建公網上面的OJ,還是建議將用戶的文件權限設置好,文件的所屬用戶設置好,解決安全性的問題。

    下面以ubuntu14.04為例,服務可以選擇apache或者nginx

    首先切換到root賬戶,如果root沒有設置,請用你裝系統時用的賬戶修改密碼

    sudopasswd root

    根據提示修改密碼后


    suroot

    切換到root,安裝相應軟件

    apt-getinstall update

    apt-getinstall php5.0

    apt-getinstall apache2

    apt-getinstall mysql-server

    apt-getinstall mysql-client

    apt-get-f install

    我們裝好了必要的軟件。

    1.3下載項目

    github上找到hustoj下載下來。

    下載地址https://github.com/zhblue/hustoj[1]

    解壓后或得到幾個文件

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖1


    解壓后文件如圖1Wiki是該項目的說明。我們需要的文件是trunk這個文件夾里面的。進入文件夾trunk會有圖3這些東西。Install里面是安裝的腳本,core是判題服務的代碼,web是前端的文件。


    1.4web配置


    因為我們裝的是apache,所以我們把web文件夾里面的東西放到/var/www/html/?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?

    所以,我們進入刪除?html目錄 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    ? ? ? ? ? ? ? ? ? ? ? ? ?2

    rm-r /var/www/html/

    mvweb/ /var/www/html

    chown-R www-data:www-data /var/www/html/ ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    用瀏覽器進入看看web是否安裝成功。如果如圖2所示就代表前端安裝成功了。

    3

    下面就是修改配置文件,配置文件在/var/www/html/include/db_info.inc.php

    vim打開他修改它對應的信息。


    static$DB_HOST="localhost";數據庫的服務器地址

    static$DB_NAME="jol";數據庫名

    static$DB_USER="root";數據庫用戶名

    static$DB_PASS="root";數據庫密碼//connect db

    static$OJ_NAME="HUSTOJ";OJ的名字,將取代頁面標題等位置HUSTOJ字樣。

    static$OJ_HOME="./";OJ的首頁地址

    static$OJ_ADMIN="root@localhost";管理員email

    static$OJ_DATA="/home/judge/data";測試數據所在目錄,實際位置。

    static$OJ_BBS="discuss";//"bbs"論壇的形式,discuss為自帶的簡單論壇,bbs為外掛論壇,參考bbs.php代碼。

    static$OJ_ONLINE=false;是否使用在線監控,需要消耗一定的內存和計算,因此如果并發大建議關閉

    static$OJ_LANG="cn";默認的語言,中文為cn

    static$OJ_SIM=true;是否顯示相似度檢測的結果。

    static$OJ_DICT=false;是否啟用在線英字典

    static$OJ_LANGMASK=1008;//1mC2mCPP 4mPascal 8mJava 16mRuby 32mBash 1008 for security reason tomask all other language?用掩碼表示的OJ接受的提交語言,可以被比賽設定覆蓋。

    static$OJ_EDITE_AREA=true;//是否啟用高亮語法顯示的提交界面,可以在線編程,無須IDE

    static$OJ_AUTO_SHARE=false;//true:自動分享代碼,啟用的話,做出一道題就可以在該題的Status中看其他人的答案。

    static$OJ_CSS="hoj.css";默認的css,可以選擇dark.cssgcode.css,具有有限的界面制定效果。

    static$OJ_SAE=false;//是否是在新浪的云平臺運行web部分

    static$OJ_VCODE=true;是否啟用圖形登錄、注冊驗證碼。

    static$OJ_APPENDCODE=false;是否啟用自動添加代碼,啟用的話,提交時會參考$OJ_DATA對應目錄里是否有append.c一類的文件,有的話會把其中代碼附加到對應語言的答案之后,巧妙使用可以指定main函數而要求學生編寫main部分調用的函數。

    static$OJ_MEMCACHE=false;是否使用memcache作為頁面緩存,如果不啟用則用/cache目錄

    static$OJ_MEMSERVER="127.0.0.1";memcached的服務器地址

    static$OJ_MEMPORT=11211;memcached的端口

    static$OJ_RANK_LOCK_PERCENT=0;//比賽封榜時間的比率,如5小時比賽設為0.2則最后1小時封榜。

    static$OJ_SHOW_DIFF=false;//顯示WrongAnswer時的對比[2]



    1.5判題服務的搭建

    進入圖3core目錄里面,找到make.sh。首先chmod+x make.sh?然后運行這個文件.接著編譯好后會出現兩個可執行程序分別把這兩個程序放在/usr/bin里面。

    #!/bin/bash

    #beforeinstall check DB setting in

    # judge.conf

    # hustoj-read-only/web/include/db_info.inc.php

    # and downhere

    #and runthis with root


    #CENTOS/REDHAT/FEDORAWEBBASE=/var/www/html APACHEUSER=apache

    WEBBASE=/var/www/html

    APACHEUSER=www-data

    DBUSER=root

    DBPASS=root


    #try installtools

    sudo apt-getinstall make flex g++ clang libmysql++-dev php5 apache2 mysql-serverphp5-mysql php5-gd php5-cli mono-gmcs subversion

    sudo/etc/init.d/mysql start


    sudo yum -yupdate

    sudo yum -yinstall php httpd php-mysql mysql-server php-xml php-gd gcc-c++ mysql-devel php-mbstring glibc-static flex

    sudo/etc/init.d/mysqld start


    sudo svncheckout https://github.com/zhblue/hustoj/trunk/trunkhustoj-read-only


    #create userand homedir

    sudo /usr/sbin/useradd -m -u 1536 judge




    #compile andinstall the core

    cdhustoj-read-only/core/

    sudo./make.sh

    cd ../..

    #install weband db

    sudo cp -Rhustoj-read-only/web $WEBBASE/JudgeOnline

    sudo chmod-R 771 $WEBBASE/JudgeOnline

    sudo chown-R $APACHEUSER $WEBBASE/JudgeOnline

    sudo mysql-h localhost -u$DBUSER -p$DBPASS < db.sql


    #create workdir set default conf

    sudo ? mkdir /home/judge

    sudo ? mkdir /home/judge/etc

    sudo ? mkdir /home/judge/data

    sudo ? mkdir /home/judge/log

    sudo ? mkdir /home/judge/run0

    sudo ? mkdir /home/judge/run1

    sudo ? mkdir /home/judge/run2

    sudo ? mkdir /home/judge/run3

    sudo cpjava0.policy ?judge.conf /home/judge/etc

    sudo chown-R judge /home/judge

    sudo chgrp-R $APACHEUSER /home/judge/data

    sudo chgrp-R root /home/judge/etc /home/judge/run?

    sudo chmod775 /home/judge /home/judge/data /home/judge/etc /home/judge/run?


    #boot upjudged

    sudo cpjudged /etc/init.d/judged

    sudo chmod+x ?/etc/init.d/judged

    sudo ln -s/etc/init.d/judged /etc/rc3.d/S93judged

    sudo ln -s/etc/init.d/judged /etc/rc2.d/S93judged

    sudo/etc/init.d/judged start

    sudo/etc/init.d/apache2 restart

    sudo/etc/init.d/httpd restart


    執行完這些語句,重啟之后就可以了。

    1.6添加超級管理員


    然后在瀏覽器上進入注冊界面。注冊一個賬戶,之后進入數據庫修改數據庫,添加超級管理員。意思就是將那個用戶插入到表privilege。圖4是表privilege的結構。在數據庫執行執行插入sql語句。

    insert intoprivilege(user_id,rightstr) values('admin','administrator');

    4

    如果一切正常這就代表你的OJ搭建好了。但是在搭建的過程中總不是一帆風順的。


    2搭建過程中常見問題

    2.1搭建好web后在瀏覽器不能訪問

    首先有可能是apache沒有正常運行,或者沒有給web正確的文件權限。看看web配置文件是否修改正確。打開配置文件看看,經常填錯的數據庫用戶名和數據庫名,再或者就是將配置文件改壞了,比如刪掉了雙引號,導致代碼編譯錯誤。這些問題解決辦法,很簡單我就不再多說了。所以在安裝apache的時候我們可以一個一個排除問題。先看看apache是否在正常運行。可能是apache沒有正常打開用命令查看apache是否正常運行。

    /etc/init.d/apache2status

    如果出問題了就得去apache官網查查幫助文檔。解決了這個問題,看看phpapache有沒有弄好,看看apache能不能解析運行php代碼。可以在/var/www/html/index.php寫上一段測試代碼,試試能不能輸出helloworld,如果不能說明apache沒有加載php模塊。

    問題一個一個排除,這幾個問題排除之后還不能運行,就很可能文件在下載或者解壓的過程中文件有所損壞。

    2.2不判題可能原因

    首先看看判題機的配置文件寫好了沒,配置文件

    目錄為:/home/judge/etc/judge.conf


    OJ_HOST_NAME=127.0.0.1如果用mysql連接讀取數據庫,數據庫的主機地址

    OJ_USER_NAME=root數據庫帳號

    OJ_PASSWORD=root數據庫密碼

    OJ_DB_NAME=jol數據庫名稱

    OJ_PORT_NUMBER=3306數據庫端口

    OJ_RUNNING=4judged會啟動judge_client判題,這里規定最多同時運行幾個judge_client

    OJ_SLEEP_TIME=5judged通過輪詢數據庫發現新任務,輪詢間隔的休息時間,單位秒

    OJ_TOTAL=1老式并發處理中總的judged數量

    OJ_MOD=0老式并發處理中,本judged負責處理solution_id按照TOTAL取模后余數為幾的任務。

    OJ_JAVA_TIME_BONUS=2Java等虛擬機語言獲得的額外運行時間。

    OJ_JAVA_MEMORY_BONUS=512Java等虛擬機語言獲得的額外內存。

    OJ_SIM_ENABLE=0是否使用sim進行代碼相似度的檢測

    OJ_HTTP_JUDGE=0是否使用HTTP方式連接數據庫,如果啟用,則前面的HOST_NAME等設置忽略。

    OJ_HTTP_BASEURL=http://127.0.0.1/JudgeOnline使用HTTP方式連接數據庫的基礎地址,就是OJ的首頁地址。

    OJ_HTTP_USERNAME=admin使用HTTP方式所用的用戶帳號(HTTP_JUDGE權限),該帳號登錄時不能啟用VCODE圖形驗證碼,但可以登錄成功后啟用。

    OJ_HTTP_PASSWORD=admin密碼

    OJ_OI_MODE=0是否啟用OI模式,即無論是否出錯都繼續判剩余的數據,在ACM比賽中一旦出錯就停止運行。

    OJ_SHM_RUN=0是否使用/dev/shm的共享內存虛擬磁盤來運行答案,如果啟用能提高判題速度,但需要較多內存。

    OJ_USE_MAX_TIME=1是否使用所有測試數據中最大的運行時間作為最后運行時間,如果不啟用則以所有測試數據的總時間作為超時判斷依據。[3]


    這個是配置文件的注釋,按照你想要的,數據庫密碼正確填寫,這里寫配置文件不需要添加引號.重啟判題機,由于有很多依賴kill命令不能夠干掉這個進程,所以需要用到-9這個參數。題目的測試數據如果不能夠上傳,可能是/home/judge/data/這個目錄文件讀寫權限有點問題,我們可以直接把他設為777

    chmod -R 777/home/judge/data/


    ?

    3 hustoj的文件結構

    3.1前臺文件結構

    ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖5

    后臺管理的相關文件admin,管理的相關php文件;

    bbs是討論版的相關代碼;

    template是前臺的一些模板,flat-ui,bs,bs3

    其他是一些插件的包含文件。

    3.2判題部分的文件結構

    data ?etc log ?run0 ?run1 ?run2 ?run3

    判題部分,文件,data是放測試數據的文件夾,里面還是文件夾,文件夾名字是題目的id,每個題目一個文件夾,文件夾里面是輸入輸出,可以是多組測試數據。多組測試數據文件名字相同的看的是后綴.in是輸入文件。同樣的文件名對應的.out文件是輸出文件。如果不是特判就是簡單對比文件是否一樣,如果是特判,那么特判需要自己寫一個特判的規則,放在當前的文件夾。etc/文件夾是放判題的配置文件以及判題的服務程序,和主程序。Run0~3?對應的文件夾是編譯用戶提交代碼并運行的地方。里面是一個小的linux環境,邊溝編譯運行代碼。



    4.OJ安全性問題

    評測雞的實現,已經有了很多不考慮安全問題的版本。因此這里只討論安全問題。


    我大概把評測攻擊分為兩部分:編譯時攻擊、運行時攻擊。


    編譯時攻擊


    編譯時攻擊是很多評測雞并沒有防范的。例如下面幾種攻擊情況:


    編譯超時


    #include</dev/random> ? ? ?# Linux

    #include<CON> ? ? ? ? ? ? ?# Windows


    這種攻擊方式的原理是,讓編譯器讀一個永遠也讀不完的文件,把評測雞卡死在編譯階段。BZOJ已經被這段代碼卡掉很多次了。


    示例:提交記錄#3019- PYOJ

    解決辦法:設置編譯的時間限制,或者用vfk的辦法,把編譯器監控起來。


    輸出巨大文件


    我們在做數論題的時候玩過這種事情:inta[10000000]={1,0},這樣編譯出來的文件會特別大。在我的機器上,它的大小是39MB


    我們想到,讓編譯器生成一個極大的文件。下面是一個針對gcc的編譯炸彈,從wikicoding.org蒯來的。全文如下:


    main[-1u]={1};

    編譯這段代碼之后,會生成16GB的文件。


    示例:提交記錄#2912- PYOJ

    解決辦法:設置編譯出來的可執行文件的大小限制。


    include攻擊

    include攻擊同時被vfleaking(UOJ)和李揚(QDUOJ)描述。向二位致敬。


    include攻擊是指:用C/C++代碼include網站的配置文件,然后通過返回的編譯錯誤信息,讀取密碼。


    例如。對于hustoj,可以采用下面的代碼:


    #include"/var/www/JudgeOnline/include/db_info.inc.php"


    這份代碼將會include數據庫的配置文件。上交這份代碼,將會返回如下的編譯信息:



    事發后,hustoj的這個漏洞已經在一年前修復。


    示例:提交記錄#3020- PYOJ

    我的解決方法:


    評測雞和服務雞必須隔離。

    設置好文件權限(hustoj就是這樣修復漏洞的)。

    最好不要告訴用戶編譯錯誤的信息。

    vfk的解決辦法:把編譯器監視起來。


    另外riteme提出了另一種鬼畜的解決辦法。見[漏洞報告]include攻擊&middot;Issue #14 &middot; hzxie/voj?


    需要注意的一點:不要想著用檢查用戶代碼的形式規避攻擊。C/C++define功能可以輕易繞過這些檢查。



    運行時攻擊


    運行時攻擊,已經有比較好而且通用的解決方案。解決這個問題難度并不大。


    運行系統指令


    system("shutdownnow");


    這種攻擊方式很早就被解決了。


    示例:提交記錄#3021- PYOJ

    解決方法:用沙箱跑評測,可以采用ptrace。但是我準備用一種更暴力的方案。直接把程序扔進docker里面跑,它愛玩成什么樣就玩成什么樣吧233


    fork炸彈

    曾經有OJ被選手程序不停地fork()搞炸了。


    我沒有拿到代碼,因此這里沒法分析。


    故意運行超時


    while(1):pass

    然后突然交一大堆這種程序,以達到類似DDOS的效果&hellip;&hellip;


    這種東西很沒技術含量。下面是一份針對hustoj的腳本:


    https://gist.github.com/Ruanxingzhi/9f0caba5e2d8a690ae1e89bcfb92abba

    效果是用1000個賬號,每個賬號提交10次,每個賬號在提交之后休息11s

    體現為:兩分鐘內,OJ上面多了一萬份提交。


    解決方法:注冊的時候設置驗證碼,如果一個賬號短時間內多次提交,在這個賬號下一次提交的時候也需要驗證碼。


    請注意,注冊的時候,只用郵箱驗證,不用驗證碼是不行的!

    總結


    我玩了這么久的OJ,一共也就發現這幾種攻擊方式&hellip;&hellip;

    但是好像很多OJ對編譯時攻擊防范并不好。

    點蠟燭。希望OJ做得越來越好吧。[4]

    以上是知乎大神總結的,還有就是通過插件的漏洞進行攻擊,比如kindedit之前的漏洞,可以繞過cookie上傳文件。對了,最好把配置文件弄成judge用戶不可以操作的權限。這樣數據庫密碼免得泄露了。


    時間、資源的限制:

    內存:我使用了rlimit進行控制,同時也方便在運行結束后獲得內存使用情況的數據,不過有一個&ldquo;缺點&rdquo;就是如果是聲明了一個超大的空間但從未訪問使用就不會被統計進來(經過觀察發現很多ACM或者OI比賽也都是這么處理的,所以應該不算是一個問題)。

    時間:首先同樣也是使用rlimit進行CPU時間控制。注意它只能控制CPU時間,不能控制實際運行時間,所以像是sleep或者IO阻塞之類的情況是沒有辦法的,所以還在額外添加了一個alarm來進行實際時間的限制。按照大部分比賽的管理,最終統計的時間是CPU時間。

    文件句柄:同樣可以通過rlimit來實現,以保證程序不要打開太多文件。不過其實文件這一塊問題是比較多的,如果可行的話最好還是使用stdio然后管道重定向,完全禁止程序的文件IO操作。

    訪問控制:

    通過chroot建立一個jail,將程序限制在指定目錄中運行。由于是比賽程序,使用的動態鏈接庫很有限,所以直接靜態編譯,從而使得運行目錄中連.so都不需要。

    進行必要的權限控制,例如將輸入文件和程序文件本身設置為程序的運行用戶只讀不可寫。

    權限控制:

    監控程序使用root權限運行,完成必要準備后?fork并切換為受限用戶(比如nobody)來運行程序。

    rlimit?設置的都是hardlimit?,非root無法修改。

    正確設置運行用戶之后,之前由root創造的jail受限用戶是無法逃出的。

    系統調用控制:

    上面這些(尤其是第一步)是有很大問題,就算不是root,也還能做到很多事情。且不說fork之類的,光是那個alarm,就可以很輕松的把計時器取消了或者干脆主動接收這個信號。所以最根本的還是需要使用ptrace之類的調試器附著上程序,監控所有的系統調用,進行白名單+計數器(比如execopen)過濾。這一步其實是最麻煩的(不同平臺的系統調用號不一樣,我們使用的是strace項目里頭整理的調用號)。

    更進一步:

    如果你對操作系統更熟悉,那么還有一些更有趣的事情可以做。比如Linux下的seccomp功能(seccomp- Wikipedia?ChromeLinux?版就在沙盒中使用了這個技術),尤其是后期加入了seccomp-bpf之后變得更加易用。還比如SELinux也可以作為defend-by-depth的一環。另外,cgroup其實也可以用得上。

    結束語

    搭建了hustoj,只會這些還不夠,最好自己寫一下判題機什么的,要深入了解學習才有收獲。如果只是按照教程弄一下,并不會有很大的收獲。作為了名ACM理解判題原理是很有用的,這樣對解題也是很有用的。學無止境。


    參考文獻

    [1]ZHBLUE,HUSTOJWIKI,https://github.com/zhblue/

    [2]LIUXINGDEBLOG,hustoj永久等待或編譯并評判解決方法hustoj,https://www.myvary.cn/index.php/2016/05/11/hustoj-ing/,2016-05-11

    [3]OMG_BY,linuxubuntu搭建hustOJ系統,http://www.cnblogs.com/OMG-By/p/5978831.html

    [4]RUANXINGZHI,OJ技術思考:評測安全,https://zhuanlan.zhihu.com/p/26984739

    ?

    轉載于:https://www.cnblogs.com/coded-ream/p/7207916.html

    總結

    以上是生活随笔為你收集整理的在线判题系统hustoj的搭建的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。