'hustoj'에 해당되는 글 4건

  1. 2011.04.24 hustoj 기타 수정
  2. 2011.04.24 hustoj에서 일부 언어만 허용 (LANGMASK)
  3. 2011.04.24 hustoj 설치 (2)
  4. 2011.04.24 hustoj 설치 (1) 7
  5. .
아직미분류2011. 4. 24. 02:31

설치 방법은 http://noexists.tistory.com/193 참고

이 글은 정리되지 않은 글이다. (그렇다고 다른 글이 특별히 정리된 건 아니지만...)

파일로도 제출 받는 기능

submitpage.php의 form에 enctype="multipart/form-data" 넣는다.
<script type="text/javascript">
function tg(bool) {
document.getElementById('source_file').disabled = !bool;
document.getElementById('source').disabled = bool;
}                       
</script>               
<hr />
<input type="radio" name="source_sel" value="file" checked="true" onclick="tg(true)" /> Use a file <br />
<input type="hidden" name="MAX_FILE_SIZE" value="65536" />
<input type="file" id="source_file" name="source_file" /> <br />
<hr />
<input type="radio" name="source_sel" value="textarea" onclick="tg(false)" /> Use the textarea <br />
<textarea cols=80 rows=20 id="source" name="source" disabled="disabled"></textarea><br>
if ($_POST['source_sel']=='file') {
        $uploaddir = '/var/www/uploads/';
        $uploadfile = $uploaddir . $user_id . "_" . basename($_FILES['source_file']['name']);
        if (move_uploaded_file($_FILES['source_file']['tmp_name'], $uploadfile)) {
                $source = file_get_contents($uploadfile);
        //      unlink($uploadfile);
        } else {
                require_once("oj-header.php");
                echo "Upload error";
                require_once("oj-footer.php");
                exit(0);
        }
} else {
        $source=$_POST['source'];
        if(get_magic_quotes_gpc())
                $source=stripslashes($source);
}
/var/www/uploads 디렉토리도 만들어야한다. chown www-data도 해주고

소스 코드 다운로드 기능
downloadsource.php을 만든다.
showsource.php를 뜯어 고침.
하이라이트 기능 제거, htmlspecialchars 제거.
불필요한 것 최대한 제거.
헤더를 고쳐서 c 파일로 다운로드 되게 만들기.
줄바꿈 문자 수정.
소스코드 보는 링크 부분에 링크 추가.

status.php, problemstatus.php
기본적으로 자신의 결과만 보이게 함. (남의 결과를 보는 것을 막는 것은 아님)
source_browser는 다 보는 것이 기본
$user_id="";
if (isset($_GET['user_id'])){
        $user_id=trim($_GET['user_id']);                                                                              
        if (is_valid_user_name($user_id) && $user_id!=""){
                $sql=$sql."AND `user_id`='".$user_id."' ";                                                            
                if ($str2!="") $str2=$str2."&";                                                                       
                $str2=$str2."user_id=".$user_id;                                                                      
        }else $user_id="";
} else {                                                                                                              
        if(! isset($_SESSION['source_browser'])) {                                                                    
                $user_id = $_SESSION['user_id'];                                                                      
                if (is_valid_user_name($user_id) && $user_id!=""){                                                    
                        $sql=$sql."AND `user_id`='".$user_id."' ";                                                    
                        if ($str2!="") $str2=$str2."&";                                                               
                        $str2=$str2."user_id=".$user_id;                                                              
                }else $user_id="";
        }       
}

showsource.php
관리자에게는 제출 시간과 IP 정보가 보이게 바꿈. 카피 잡을 때 유용

if (isset($_SESSION['administrator'])) {                                                          
	echo "\tIP: $row->ip\n";
	echo "\tSubmission Time: $row->in_date\n";                                                            
}


Posted by asdfzxcv
아직미분류2011. 4. 24. 02:02

설치 방법은 http://noexists.tistory.com/193 참고

일부 언어만 허용하고 싶은 경우가 있다. 여기서는 C 언어만 허용하는 상황을 예로 들어 보겠다.

static $OJ_LANGMASK=126; // C 언어만 허용.

이렇게 LANGMASK 설정만 해서 모든 것이 완벽하면 좋겠지만 그렇지 않다.

submitpage.php
C 언어만 받도록 하기 위해 $langmask=126을 추가한다. 위치가 중요한데, "$lang=(~((int)$langmask))&127;"의 바로 위에 넣어야 한다. 왜냐하면 $langmask=$_GET['langmask'];을 통해 덮어 씌우는 일을 막아야 하기 때문이다. (GET이라는 것은 a.php?langmask=1처럼 url로 변수를 전달하는 것이다.) 사실, contest에서는 LANGMASK 설정이 따로 있어서 이런 식으로 된 것 같다. 그러나 사용자가 직접 url을 수정해서 langmask를 바꾸면 어쩌려고 그러나? 코드를 읽다보면 이런 식으로 url 공격에 취약(?)한 부분이 보인다.

이렇게 해도 아직 완벽하지 않다. 사용자에게 보여지는 페이지는 사용자가 조작이 가능하기 때문이다. (그리스몽키 등으로 option 태그를 바꿔버리는 방법 등이 있다.) 안전하게 하려면 submit.php에서 한 번 더 language가 허용되는 language인지 확인해야 한다.

Posted by asdfzxcv
아직미분류2011. 4. 24. 01:57

이 글은 http://noexists.tistory.com/193에서 이어진다.

admin/msg.txt
공백으로 만들자.

oj-header.php
가장 뒤의 <script ...> 두 줄을 제거하자. 이상한 것이 자꾸 뜬다.

oj-footer.php
언어를 고를 수 있는데, 한국어와 영어 등 필요한 것만 남겨두고 제거하자.
불필요한 메시지를 삭제하자.

관리자 아이디 만들기
일단 보통 회원으로 가입한다.
mysql을 실행하고 "use my_oj;"까지 잘 한 뒤에, 다음 명령을 내리자.

INSERT INTO privilege(user_id,rightstr) VALUES('my_id','administrator');

여기서 administrator는 그냥 그대로 치라는 소리다. (id는 물론 상황에 맞게 바꿈.)
최초의 관리자만 이렇게 어렵게 만들고 다음부터는 관리자 페이지를 이용할 수 있다.
참고로 남의 소스를 보려면 source_browser 권한도 있어야 한다.

문제 만들기 TIP
테스트 입력이 없어도 뭔가 아무거나 적어야 채점 프로그램이 동작한다.

잘 안 될 때
/home/judge로 이동한다. (물론 설치 시 id를 다른 걸로 했으면 그것으로 사용)
/home/judge/etc/judge.conf의 설정을 확인한다.
sudo pkill judged && judged
이제 다시 시도해보자.
이래도 안 되면 run? 디렉토리들의 퍼미션을 771로 해준다.
sudo pkill judged && judged
이제 다시 시도해보자.

유사도 적발 기능이 작동하지 않을 때
특정 64-bit 리눅스에서 sim_c가 작동하지 않는 경우가 있다. 간단하게 bash에서 sim_c 명령을 내려보자. 만약 그런 명령이 없다고 나온다면, hustoj 최신 버전을 받은 후, hustoj-read-only/core/sim만 재설치를 시도하자.

hustoj 관련 다른 글
2011/04/24 - [분류 전체보기] - hustoj에서 일부 언어만 허용 (LANGMASK)
2011/04/24 - [분류 전체보기] - hustoj 기타 수정

Posted by asdfzxcv
아직미분류2011. 4. 24. 00:54

얼마 전에 hustoj를 설치했다. 아주 최근에 설치한 것은 아니고, 얼마 전에 설치한 것이라 최신 버전과 다른 부분도 있겠지만 많이 다르지는 않을 것이다. 우분투 리눅스 기준으로 설명했지만, 패키지 설치 방법만 제외하면 다른 리눅스라도 거의 비슷할 것이다.
http://code.google.com/p/hustoj/

제 1 단계: 패키지 설치

install.sh에 패키지 설치 코드가 있지만, 사용 환경에 따라서 이게 잘 안 될수도 있다. 예를 들면, 사용 환경에 svn이 없으면 설치 스크립트의 제일 처음에 나오는 svn checkout부터 안 될 수가 있다. 패키지를 설치하려면 subversion도 설치했어야 하는 거 아닌가? 그리고 인스톨 스크립트에 apt-get하고 yum이 같이 적힌 이유도 잘 모르겠다.

$ sudo apt-get update
$ sudo apt-get install subversion
$ sudo apt-get install g++ libmysql++-dev php5 apache2 mysql-server php5-mysql

제 2 단계: mysql 계정 만들기

일단 mysql 계정을 하나 만드는 것이 좋다. 쓸데 없이 root 계정을 쓰는 것은 보안상 안 좋을 수도 있으니까. 그리고 기본적으로는 jol 데이타베이스를 쓰도록 되어 있지만, 필요에 따라 데이타베이스를 다른 이름으로 해야하는 경우도 있다.

$ mysql -uroot -p
Enter password: (암호 입력)
mysql> set names utf8;
mysql> create database my_oj;
mysql> grant usage on *.* to 'db_id' identified by 'db_password';
mysql> grant all on my_oj.* to 'db_id';

제 3 단계: judge 계정 생성

채점 데몬이 실행되는 계정을 만들어야 한다. 사실, install.sh를 보면 계정 생성 명령이 있지만, uid가 겹쳐서 문제가 되는 경우도 있을 수 있다. 그러므로 안전하게 직접 설치하는 방법을 택하자. 여기서 uid를 무엇으로 하든, 그 uid가 뭔지는 알아야 한다. 사실 1536 말고 다른 uid는 안 써봤는데, 만약 uid까지 달라지면 소스 코드를 수정해야 하므로 매우 귀찮아진다. (소스 파일에서 setuid나 setresuid 부분을 수정해야 한다.)

$ sudo useradd -m -u 1536 judge

제 4 단계: 데이타베이스 테이블 생성

먼저 db.sql을 편집기로 열고 jol을 찾아서, my_oj로 고치자. 자칫 잘못하면 가장 위의 두 줄만 수정하고 넘어가기 쉬운데, 파일 아래쪽에도 jol이 등장하니 찾아서 전부 고쳐야 한다.

  • Line 2: 주석처리.
  • Line 3: use my_oj;
  • Line 295
  • Line 298

편집이 잘 된 것 같으면, "mysql -u$ID -p < db.sql"를 실행하자. ($ID는 적절히 대체.)

제 5 단계: 본격적인 설치

먼저 judge.conf를 열고 적절히 고치자.

  • OJ_HOST_NAME은 알아서 고치자.
  • OJ_USER_NAME, OJ_PASSWORD는 mysql 계정이다.
  • OJ_DB_NAME은 제 4 단계에서 생성한 것으로 고치자.
  • OJ_SIM_ENABLE은 코드 유사도 적발 기능이 필요한 경우 1로 하면 된다.

이제 install.sh를 편집기로 열고, 고쳐야 할 것들을 찾아서 고쳐야 한다.

  • 앞선 단계에서 이미 처리한 명령은 주석처리하자.
  • WEBBASE를 적절히 수정하자. 우분투 기본 설정에서는 수정할 필요가 없다.
  • DBUSER, DBPASS를 수정하자.
  • Line 24에 "cd ../.."을 추가해서 make 이후에 원래 경로로 돌아오도록 고치자.
  • 곳곳의 chown, chgrp 명령에서 www-data는 배포판에 따라 알맞게 수정하자.
  • 혹시, 제 3 단계에서 다른 계정명을 생성했다면, 알아서 적질히 고치자.

이제 드디어 "./install.sh"를 하면 된다.

제 6 단계: php 파일 고치기

이제 "/var/www" 디렉토리로 이동하자. 그리고 "JudgeOnline" 디렉토리를 마음에 드는 이름으로 고치고, 그 안으로 이동하자. 여기서 "./include/db_info.inc.php"를 열어 보면 설정할 것들이 남아 있다. 가장 중요한 설정만 적으면 다음과 같다.

static $DB_HOST="127.0.0.1";
static $DB_NAME="my_oj";
static $DB_USER="db_id";
static $DB_PASS="db_password";
static $OJ_NAME="My OJ";
static $OJ_HOME="http://server/path";
static $OJ_ADMIN="mail@server";
static $OJ_DATA="/home/judge/data"; // 혹시 계정명을 다르게 한 경우 수정.
static $OJ_LANG="ko"; // 한국어를 기본으로 한다.
static $OJ_SIM=true; // 카피 적발 기능.
static $OJ_DICT=false; // 이상한 사전이므로 제거하자.

그리고 필요에 따라 아파치 서버를 재시작하고 접속해서 테스트해보자.

다음 글에서 계속: 
2011/04/24 - [분류 전체보기] - hustoj 설치 (2)

hustoj 관련 다른 글
2011/04/24 - [분류 전체보기] - hustoj에서 일부 언어만 허용 (LANGMASK)
2011/04/24 - [분류 전체보기] - hustoj 기타 수정

Posted by asdfzxcv