'세션'에 해당되는 글 2건

  1. 2007/09/21 Apec Cyber Academy, 허술한 페이지 설계는 뚫리기 마련 (5)
  2. 2007/06/10 미궁게임 PHP 버전 (2)

필자는 10월 1일부터 Apec에서 주최하고 대만 교육부에서 주관하는 Apec Cyber Academy(이하 ACA)에 참가한다. 물론 국제대회이고, 상급은 1등상이 대만 교육부장관상일 만큼 꽤 큰 대회이고, 올해가 6회 대회로, 역사가 짧은 대회도 아니다.

이 대회에 참가하기 위해서는 팀을 구성해야 하는데, 올해부터 팀 구성에 한 가지 관문이 생겼다. 바로 Survivor Online이라는 게임을 통과해야 하는 것이다. 게임이라고는 하지만 게임이라기보다는 퀴즈에 가까운 컨텐츠로, 인터넷 개인정보 보호(Safe)와 정보 불법 도용 및 복제 방지(Honest)의 두 가지 주제에 대한 인식 검사 정도로 보면 된다. 쉬워 보일 수 있으나, 퀴즈를 푸는 도중 한 문제라도 틀리면 처음으로 돌아가는데다가 문제마다 플래시 애니메이션이 있어서 시간이 상당히 소요되기 때문에 통과하기가 매우 힘든 것이 사실이다.

그래서 어떻게 편법을 써서 이를 통과할 방법이 없을까를 고민했다. 가장 먼저 생각해 본 것은, 맨 마지막 페이지에서 지금까지 맞은 문제의 개수와 틀린 문제의 개수를 집계하여 이를 이용해 통과 여부를 결정할 테니, 그 중간의 맞은 문제 개수 전달 과정을 잡아 내어 조작하면 될 것이라는 것이었다. 그래서 혹시 Form 내부의 Input을 Hidden으로 해 놓고 이에 숨겨 놓지는 않았나 검사해 보았다. 하지만 소스 코드는 너무나 깨끗했고, 어디에서도 맞은 문제의 개수가 저장되어 있는 Form을 찾을 수는 없었다.

그래서 일단 성실히 문제를 풀어 나가서 맨 마지막 페이지의 주소를 알아내었다. 수고롭게도, 주소 표시줄의 주소를 변경시키지 않고 페이지만 이동하도록 설계된 사이트여서 페이지 이동시 주소는 상태표시줄에 로딩 메시지가 잠깐 뜰 때 이를 캡쳐하여 볼 수밖에 없었다. 알아낸 주소는, /lwf/so/intro_safe_q.asp?t=1&s=20이었다. 그런데, 의외의 수확이 있었다. 바로 주소 뒤에 get 형식으로 인자 두 개가 따라오는 것을 볼 수 있었기 때문이었다.

사용자 삽입 이미지

t는 어떤 역할을 하는지는 전혀 유추가 되지 않았기 때문에 신경 쓰지 않기로 하고 s라는 변수의 기능만 알아내면 될 터였다. 그 때 상황이 필자가 10문제 중 2문제를 맞히고 마지막 페이지에 도착한 상태였고, 이를 이용해 s를 유추해 내면 대략 100점 만점의 점수(score)를 나타내는 변수라고 생각할 수 있었다.

그리하여 즉시 /lwf/so/intro_safe_q.asp?t=1&s=100 이라는 주소로 접속을 해 보았더니 여전히 'Try Again' 메시지가 떴다.
사용자 삽입 이미지

혹시나 하여 t를 0으로 주어 접속을 해 보았다. 그랬더니...
사용자 삽입 이미지

한 문제라도 틀렸을 때 나오던 Try Again 메시지는 없어지고 반가운 Pass 메시지가 떴다.

물론 서버상 정보에도 나는 이 문제를 모두 통과한 것으로 기록되어 있다. 국제 대회에서 이러한 문제가 발생한 이유는 페이지 설계에서 보안을 무시했던 탓이다. POST나 GET이나 그게 그거겠지 하는 생각이나 세션 관리의 허술, 자바스크립트의 지나친 노출 등이 모두 사이트 설계의 헛점이다. 이 사이트의 경우 세션 등으로 처리해야 할 데이터를 GET으로 넘겨줌으로써 이를 사용자가 너무나 쉽게 조작할 수 있게 했다는 것이다. 퀴즈이니까 이런 문제들이 그냥 넘어갈 수 있지, 만약 개인정보가 이러한 방식으로 날아다닌다면 심각한 문제가 될 것이다.

이러한 예를 통해서 자신이 페이지 설계시에는 이러한 점들을 최대한 고려하여 이렇게 '어이없게' 뚫리는 일이 없도록 하자.

(덕분에 우리 팀원들은 문제를 풀지 않고 원터치로 모든 문제를 패스할 수 있게 되었다.)




2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry
우리 반 H모씨 曰,
 "미궁게임 문제 줄테니까 웹페이지좀 만들어줘."

뭐 그냥 일반적인 미궁 게임처럼 페이지 이름을 답으로 해서 넘어가는 형식으로 하면 되지만, PHP 공부도 할 겸 해서 DB에 문제와 답을 저장하고 하나의 페이지에서 다 할 수 있는 일명 '미궁게임 PHP Version'을 만들어보았습니다.

사용자 삽입 이미지

문제 페이지입니다.


사용자 삽입 이미지

사용자 삽입 이미지

만세~


모든 작업은 index.php 하나에서 이루어집니다. 현재 풀고 있는 문제는 세션을 이용하여 처리할 수 있도록하였습니다. 세션을 이용하여 자료를 저장하는 방법을 아키군에게 물어보니, 세션 변수에 스테이지 자체를 저장하라고 하더군요. 하지만 그래도 변수인데 솜씨 좋은 놈이 조작할까 왠지 모를 걱정이 되어 세션과 DB를 연동하여 자료를 저장했습니다. 일단 제가 저장할 것은 stage이기 때문에 데이터베이스에 session용 테이블을 하나 만들고, 여기에 session_id, expire, stage와 같은 3개의 필드를 만들어주었습니다.

session_id는 그야말로 해당 세션의 고유 아이디를 저장하고 있고, expire는 해당 세션의 만료 시간, stage는 실제로 저장될 풀고 있는 문제 번호를 저장하는 필드입니다. id는 30자리의 1부터 9까지로 이루어진 문자열을 임의로 생성하여 할당했으며, 만료 시간은 기본 1시간으로 설정하였습니다.

일단 사용자가 최초로 사이트에 접속하면 세션이 있는지를 검사하고 없다면 새로운 id를 할당한 후 이를 세션 변수에 저장하고, 생성된 id를 DB에 저장합니다. 물론 DB의 stage필드의 값으로는 초기값인 1을 넣어주어야겠지요. 만약 사용자가 문제를 맞혔다면 세션 변수에 저장되어 있는 id를 이용하여 DB에서 id와 일치하는 레코드를 찾고, 해당하는 stage값을 읽어와 1 증가시킨 후에 업데이트합니다.

또한 페이지가 열릴 때마다 세션 테이블에서 만료 시간이 지난 레코드를 모두 찾아 삭제해줍니다. 이렇게 하면 최근 1시간 이내에 생성된 세션만 남아있게 됩니다.

사실 이외에도 몇 가지 부수적인 것들이 많이 있습니다. 아직 함수화를 하는 데 익숙치가 않아서 소스코드가 매우 난잡한 게 최대 단점이랄까요. 뭐 그래도 보안상 신경을 쓴다고 써서 만든 것이니(솔직히 보안 할 문제도 아니지만) 쉽게 뚫리지는 않겠지요.

버전 업좀 하고 문제좀 만들어서 올린 후에 공개하겠습니다.


2008년 1월 19일 이후 작성된 모든 글에 대해서 퍼가는 것을 금지합니다.
퍼가고자 하시는 분은 링크를 달아 주시기 바랍니다.
Posted by Harry