게시판을 만들던중 도배 방지 기능을 넣는중에 의문점이 생겼습니다.
그야말로 단순한 게시판입니다. 부가기능 없이 단지 목록, 쓰기, 보기 정도만 됩니다.
이 게시판에 도배 방지 기능을 넣기 위해 2가지 기능을 적용해두었는데 오늘 이게 무시되는 상황이 발생해서 당황스러워서 질문을 남깁니다.
첫번째 방법은 브라우저 쿠키를 이용해서, 글 쓸때마다 쓸때의 시간을 특정 쿠키에 넣어두고, 글 작성시마다 해당 쿠키값을 검사합니다. 해당 쿠키의 값과 현재 시간 함수를 이용해 일정시간이 지나지 않았을경우 도배로 인식하고 데이터 입력을 거부합니다. 이 방법은 공격 프로그램 사용등의 고의적인 공격시엔 무용지물이라 생각합니다.
두번째 방법은 마지막으로 입력된 DB 값을 참조합니다. 마지막으로 입력된 글의 제목과, 아이피가 같은경우 시간에 관계없이 무조건 도배로 간주하고 데이터 입력을 거부합니다. 그리고 제목이 다르고 아이피만 같은경우는 현재 시각과 비교해 일정시간 이내라면 마찬가지로 도배로 간주하고 데이터 입력을 거부합니다.
이렇게 해두었는데 오늘 어떤 사람이 순간적으로 도배를 하는게 목격됐습니다. 초까지 일치하는 시간으로 약 25개의 글을 동시에 올리더군요. 그 글이 올라올때 DB 부하가 컷었는지 순간적으로 게시판에 접근이 안되는 현상까지 나타났었습니다.
글을 작성한 사람 얘기로는 랙때문이라고 하는데 실제 랙때문에 의도하지 않은 결과가 나타난것인지 공격을 위한 테스트를 해본것인지는 확실치 않습니다. 다만 제가 보기에 공격당할 여지가 있다는것을 확인하고 예방 하고자 해결방안을 찾고 있습니다..
제 예상에 사용자가 랙으로 웹페이지가 잠시 멈춰있는동안 글을 작성후 작성 버튼을 여러번 눌러놨던것이 랙이 풀리면서 웹서버로 한번에 전달이 되고, 너무 빨리 전달된 값때문에 제가 예상치 못한 문제가 생긴것이 아닌가 싶습니다..
update.php 의 DB 쿼리 순서는 다음과 같습니다.
도배확인을 위해 마지막 작성된 글 가져오기 - select * from ..... limit 0,1
글 입력(제목) - insert into ........
글 입력(내용) - insert into ........
아래는 해당 글이 올라올때의 웹서버 로그 입니다. 웹서버 기록은 시간이 저렇게 기록됐는데 DB 에 입력된 자료에는 입력된 글의 시간이 모두 같습니다.
이 상황에서 어떤 부분을 어떻게 점검/수정 해봐야 하나요..?
59.x.x.215- - [25/Mar/2006:19:45:16 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:15 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:17 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:18 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:17 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:18 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:21 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:15 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:16 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:17 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:16 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:18 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:21 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:20 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:17 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:13 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:16 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:17 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:19 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:19 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:18 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:16 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:18 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:18 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)" 59.x.x.215- - [25/Mar/2006:19:45:16 +0900] "POST /xboard/update.php HTTP/1.1" 200 68 "http://www.xxx.com/xboard/record.php?mode=write&id=no1" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322)"
DB없이 할 수 있는
DB없이 할 수 있는 방법을 생각해 보세요.
동일한 내용 도배일 경우 예를들면,
최근 특정 기간(반나절? 한시간마다?) 동안의 게시물에 대해 ip와 내용의 일부를 해쉬테이블과 유사한 것에 key-value로 보관하세요. (clear는 특정 기간마다 한다고 가정).
만일, 특정기간 이내 도배로 판명되는 경우 블랙리스트 목록에 ip를 넣어버리고 해쉬테이블에서 제거하세요. (블랙리스트는 프로세스 다시시작하는 경우를 감안 db에 넣어도 되지만, 메모리에 계속 보관하시고 db는 insert만 하시고...)
이제 블랙리스트에 있는 ip에서 접속하거나 게시하려고 하면 무조건 거부하시면 될겁니다.
도배 판명은 게시물 작성시 ip를 키로 내용물을 찾고, 그 내용물이 일치하는가 보시고 일치하면 도배로 판명하시면 됩니다.
깊은 생각없이 바로 작성한 것이므로 미처 생각지 못한 문제가 있을 수도 있으니 유의하세요.
첫번째방법은브라우저 쿠키는 브라우저에서 처리하는 거기에...브
첫번째방법은
브라우저 쿠키는 브라우저에서 처리하는 거기에...
브라우저가 무시하면 끝입니다.
(그래서 로그인정보 같은데는 세션을 많이 쓰죠. 서버에 부담을 준다는 단점이 있지만. :-( )
Written By the Black Knight of Destruction
..
왜 이런 현상이 나타나는지 알고 싶습니다.. 두번째 도배 방지 기능이 동작할때 SELECT 로 도배여부를 확인할때 안잡히고 INSERT 가 돼버리는듯 한데.. INSERT 가 순식간에 많이 일어나서 그런건지.. 이걸 해결 하려면 어떻게 해야하는지.. 보통 대형 게시판에선 어떤 방법으로 도배를 막고 있나요?
ps. 이상하게 댓글리 안달리네요 ㅜㅜ.. 벌써 세번째 남기는건데.. 이번에도 안달리려나;;
PHP, MySQL User || ~_~
Pentium4 2GHZ
512MB DDR RAM x2
160GB + 40GB IDE HDD
GeforceFX 5700
Windows 2003 / RH9 / CentOS 4.2 / Ubuntu Hoary
---------------------------------------
http://www.waitfor.com/
http://www.textmud.com/
댓글 달기