강좌
클라우드/리눅스에 관한 강좌입니다.
프로그램 분류

망. 웹 게시판 구상하기 - 3

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

[강좌] php+mysql 게시판 만들기 #망-3

안녕하세요. 디망쉬입니다.

요즘 여러 분들에게 격려와 감사의 mail/memo/쪽지 등을 받고 있습니다.
그 기분 오래 간직하기 위해 통신의 제 개인 보관함에 따로 보관 중입니다. ^^;

아 그나저나 요즘 python 에 관심을 갖기 시작했습니다.
pws (peculiar web solution : 제가 개인적으로 만드는 거에요)를 어느 정도 만들고 c/c++ 버전으로
만든 뒤 python 으로도 만들어봐야겠심다.

저의 경우 python 는 난생 처음인지라 아무리 기존의 언어들 모습을 갖고 있더라도 헤맬게 뻔하니 함께 공부할
분들과 함께 스터디 그룹을 만들 예정이구요.



icon04.gif 망. 웹 게시판 구상하기

c. 주의 사항 (보안)
CGI 는 사실 웹 서버 관리자로 하여금 매우 찝찝함을 제공하는 기술입니다.
아무리 신경을 써서 CGI script 를 만들었다고 해도 변화하는 환경과 다양한 홀은 언젠가 꼼꼼하게 짰을 CGI script 의 보안 구멍을 뚫고 맙니다.

특히 자료실 기능이 있는 php 게시판들이 보안 문제로 문제시 되곤 했습니다.
만약 확장자가 php3 인 파일을 업로드하고 이걸 클릭했을 경우 이걸 다운로드 되게 하지 않고 화면에 뿌려줄 경우, 상당히 끔직한 결과를 낳게 됩니다.
DB 비밀 번호를 빼돌린다거나 여?隙?쉘 계정을 마음껏 누비게 될 것입니다.

위의 경우 일반적인 것이고 이보다 더 다양한 보안 버그가 속속 드러나고 있기 때문에 여러분은 이점을
염두하셔야 합니다.

하지만 뭘 염두? 보안 버그 조심하자? 아니죠.
어떤 어떠한 상황은 보안상 문제를 야기시킬 수 있으니 이런 상황을 피해가야하니 이런 상황들을 미리 미리
염두해두셔야 하죠. ^^;

일단 일반적인 보안상의 문제들을 알아보고 여러분이 조심해야할 문제들을 알아보겠습니다.


1. 일반적인 보안상의 문제와 해결


a. <? php 소스 ?>
일부 게시판들은 이용자가 보다 이쁜 형태의 글 입력을 지원해주기 위해 게시판 본문, 혹은
제목에 HTML tag 를 지원시켜 줍니다.
그러나 이것은 자칫 위험한 결과를 초래할 수 있습니다.
HTML tag 를 허용할 경우 이용자가 순순히

<table border="0" cellspacing="1" bgcolor="black">
<tr>
<td bgcolor="white">디망쉬님 귀여워용</td>
</tr>
</table>

과 같이할 경우 문제가 전혀 안됩니다.
하.지.만.

<?
require "passwd.ph";
echo "$passwd";
?>

위와 같이 할 경우? 물론 위의 소스는 당연히 실행이 될 것입니다.
매우 신속하게. 만약 passwd.ph 파일이 db 접속 관련 비밀 번호가 담겨져 있을 경우 위의 세줄만으로 db 의
비밀 번호가 유출되는 거겠죠.
이것은 특히 소스를 공개하는 게시판들이 갖고 있는 문제입니다.
공개된 소스를 받은 뒤 소스를 조금 살펴보면 db 에 접속하는 비밀 번호를 갖고 있는 파일이
어디에 있고 변수명이 알아낼 수 있으니까요.

때문에 여러분은 HTML tag 를 허용할 경우 게시물 본문이나 제목 등 모든 부분에 대해서
<? , <?php <script language="php">, <% 등등을 모두 체크하여 <&lt; 로 치환하셔야 합니다.

해결 방법 :
- eregi_replace 함수 사용
- 사용 예 :

$subject = eregi_replace("<\?(.*)\?>",
"&lt;?\1?&gt;",$subject);

$subject = eregi_replace("<script([^>]*)>(.*)</script>",
"&lt;script\1&gt;\2&lt;/script&gt;",$subject);

참고로 위의 각 각의 두 줄은 한 줄입니다.
줄이 길어서 짜른거에요. :]


혹은 간단하게 html tag 자체를 적용되지 않게 하는 방법도 있지요.
다소 잔인하지만 이게 가장 확실합니다.

- str=strip_tags() 함수 사용
- 사용 예 :

$text = strip_tags($text);

b. 사용자 지정 require 문

관리를 편하게 하기 위해 이용자가 폼값으로 읽어올 파일을 지정하면 해당 파일을 읽어오게 하는 방식입니다.
주로 자료실이나 유동적 메뉴 등에 사용되지요.

이것 역시 위험합니다. 예를 들어

board.php3?file=files/01/hello.zip

이라고 하면 files/01/ 디렉토리의 hello.zip 파일을 가져온다고 하죠.
하지만 이걸 이렇게 악용할 수도 있습니다.

board.php3?file=/etc/passwd

이러면 /etc 디렉토리의 passwd 파일이 유출되죠.
물론 대부분의 시스템들이 shadow 라고 해서 passwd 파일가 덜렁 비밀번호를 관리하게 하진
않지만 역시 조심해야할 사항입니다.

이런 것은 최대한 하지 말아야할 것이며 설령 하더라도 최대한 빈틈을 막아야할 것입니다.

해결 방법 :
- 파일 고정 지정
- 설명 :

별 방법이 없습니다. 사용자가 임의로 지정한 파일을 require 로 가져오게 하지 않고 파일을
딱 정하고 무조건 그 파일만 가져오는거죠.

이것은 초기에 기획 및 콘티 작업이 중요하겠져.
그렇지 않으면 매우 불편하겠져? ^^;


c. 자료실

게시물 작성할 때 자료를 전송시키는 기능을 가진 게시판이 많습니다.
그런데 일부 게시판은 첨부된 자료의 위치를 직접 갖고 있기도 합니다.
이것은 보통 두 가지 문제가 있습니다. 첫 번째는 방금 전과 비슷한 문제구요.
다른 하나는 파일이 저장될 때마다 확장자 등을 체크해서 임의로 바꿔야만 한다는 점입니다.

만약 확장자가 php3 파일이 올라왔다고 하죠.
이걸 클릭하면 해당 파일이 '실행'되게 됩니다.
문제가 심각해질 수 있죠. 그래서 php3 확장자를 가진 파일은 확장자를 임의로 phps 로 바꿉니다.
이것이 한 두개고 그러면 상관없는데 문제는 항상 예상하지 못했던 곳에서 나오죠.

예를 들어 html 확장자에 php 코드가 들어가있다면?
txt 에는?

좀 더 쉽고 간편하게, 그러면서 최대한 문제가
발생되지 않을만한 형식은 없을까요? 있지요. :)

해결 방법 :
- 위치값을 따로 보관
- 설명 :

자료실을 예로 들죠. 이전 강좌에서 해당 자료의 경로와 파일명을 따로 저장했지요? 바로 그겁니다.

board.php3?files=/etc/passwd

식이 아니라

board.php3?mode=download&no=4

식으로 하는거죠. 즉 download 라는 전용 모드를 만드는 겁니다.
이것은 HTTP 헤더를 무조건 파일 전송 시키는 것으로 해주며 보내줄 파일의 위치는 no 가 4인 게시물의 경로명과 파일명을 알아낸 뒤 가져오면 되죠. 구체적인 방법은 나중에 쓸께요. ^^;

2. 게시판 코딩시 조심해야할 보안상의 문제와 해결 사실 별 거 없습니다.
방금 앞의 것들만 잘 막아도 어지간히 문제는 해결됩니다.
하지만 몇 번 재차 말씀드렸듯이 문제는 항상 예상 못했던 곳에서 발생되지요.
데이터 날린 뒤 보안상의 문제점을 발견하는 것은 좋지 못한 상황이겠죠? ^^;

그렇다고 모든 경우에 대한 처리를 할 순 없습니다.
그렇게 할 경우 게시판 기능보다 모든 경우에 대한 게시판의 대응 기능으로 게시판이 느려질 것입니다.

사실 보안을 완전히 하려면 이것 저것 다 막는수밖에 없지요.
html tag 사용 가능 기능도 꺼버리고 자료실 기능 빼버리고, 문서 파일 첨부 기능도 빼버리고.
하지만 게시판이라는게 모두가 같지 않습니다.
어떤 게시판은 모든 걸 다 빼버려도 상관이 없지만 어떤 게시판은 html tag 를 사용해야할 필요가 있을 것이고
어떤 게시판은 문서 첨부 기능이 있어야 할 겁니다.

휴우. 넣자니 신경쓰이고 안넣자니 불편하고. 해결점은 여러 가지겠지요.
하지만 저의 경우 이외의 것은 모두 안돼! 쪽을 선호합니다.

제대로 배우지 않았지만 if 문이 있습니다.
만약 무엇 무엇하면 어떻게 하고 그것이 아니라면 어떻게 하라 같은 제어문이죠. 예를 들어

if ($what == "1") {
echo "your number is 1";
}
elseif ($what == "2") {
echo "your number is 2";
}

라고 할 경우

만약 $what 변수에 1 이 있다면
your number is 1 을 출력시키고
그게 아니라 $what 변수에 2 가 있다면
your number is 2 를 출력시켜라

는 내용입니다. 항상 $what 이 1, 혹은 2 라면 상관없지만 그 이외의 값이 들어간다면?
전혀 뜻밖의 작동이 될지도 모릅니다.
게시판은 1 아니면 2 의 값만을 원하고 그 이외의 값은 전혀 원하지 않는다면 1 과 2 가 아닌 수에 대한 처리를 해줄 필요가 있습니다.

if ($what == "1") {
echo "your number is 1";
}
elseif ($what == "2") {
echo "your number is 2";
}
else {
echo "bad number";
}

만약 $what 변수에 1이나 2가 아닌 값이 들어오면 bad number 를 출력시킵니다. 그 어떤 값이건요.


문제의 원인은 간단합니다. 우리가 생각하지 못했던 곳에서 뜻밖의 작동이 되기 때문이죠.
그렇다면 우린 해당 작동만 처리하고 그 이외는 에러를 발생시키건 해서 처리 시켜주면 됩니다.

if 문을 많이 쓰고 이에 대한 else 를 꼭 달아줄 때마다 여러분의 게시판의 보안 수준은 높아집니다.
하지만 if 문이 많아질 때마다 여러분의 게시판은 느려집니다. ^^; 앞서 거론했듯이 일일히 파일 확장자를
if 문으로 체크하여 바꿔주고 하면 보안에 대한 처리는 하는셈이지만 그만큼 느려진다는 거죠.

그래서 우린 if 문 안쓰고도 보안상 안전을 요할 수 있는 방법을 끊임없이 고안하고 적용해봐야 합니다.
자료실의 파일 경로 및 이름을 db 에 저장하고 직접 가져오는 방식처럼요.

어이쿠. 드디어 '망'편이 끝났습니다.
'망'편은 게시판을 직접 만들지는 않지만, 제작의 기본이 되는 내용이었내요.
사실 '망'편만큼 중요한 편도 없기 때문에 많이 초보이신 분은 '망'편을 좀 더 읽으시고, 프로그래밍에(?) 좀 더
익숙한 분은 좀 더 깊은 생각과 기획을 하셔야 할 겁니다.
^^; 그나저나 가장 중요한 편이라고 해놓고선 설명을 다소 부족하게 하지 않았나 걱정입니다. ^^;

다음 강좌인 '쉬' 편은 본격적으로 게시판 코딩에 들어가는 것이지요.
하지만 '쉬'편의 특성상 모든 편이 한 번에 올라올 예정이랍니다.
서로들 관련이 있기 때문이죠.
올라올 예정일은 1~2일 늦춰진 7월 2~3일쯤 될 것 같습니다.

미숙한 강좌 읽고 격려해주신 분들 정말 감사드리며,
비교적 버거울 수 있는 내용의 '망'편까지 따라오시느라 수고하셨어요. ^^V

다음 강좌에서 뵈요.

----------------------------
함께하면 즐거운 사이트들 (-_-; 광고임 -_-;)
http://game.creple.com/delthia
http://creple.com
http://coco.st
----------------------------


- ?! 디망쉬

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,043 명
  • 현재 강좌수 :  35,853 개
  • 현재 접속자 :  90 명