게시판을 만들던중 도배 방지 기능을 넣는중에 의문점이 생겼습니다. (2)
그야말로 단순한 게시판입니다. 부가기능 없이 단지 목록, 쓰기, 보기 정도만 됩니다.
이 게시판에 도배 방지 기능을 넣기 위해 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)"
왜 이런 현상이 나타나는지 알고 싶습니다.. 두번째 도배 방지 기능이 동작할때 SELECT 로 도배여부를 확인할때 안잡히고 INSERT 가 돼버리는듯 한데.. INSERT 가 순식간에 많이 일어나서 그런건지.. 이걸 해결 하려면 어떻게 해야하는지.. 보통 대형 게시판에선 어떤 방법으로 도배를 막고 있나요?
ps. 이상하게 아래 원본글에 댓글이 안달리네요 ㅜㅜ.. 세번 시도 해보고 안남겨져서 새 글로 작성합니다...
sdf
dsfs df
Captcha
캅차를 다세요
흠.. 아마도 제글을 보시고 그렇신듯...
글을 올리는중 서버가 리셋이 됐다고 하길래 리로드를
눌렀더니 데이타전송을 다시하라고 하냐고 묻더라고요
Yes랬더니 글을 두개가 중복되 올려졌습니다.
죄송합니다.
댓글 달기