-
- 1. 스팸 방지용 필드
-
-
- 1.1. 사용법
-
- 1.2. 문제점 또는 부작용
-
- 1.3. wiki.pl 수정
-
- 1.4. action/comments.pl 수정
-
- 1.5. 추가 업데이트 내역
-
- 1.6. 사용자 의견
-
1. 스팸 방지용 필드
[리카넷:가짜블로그 - 스팸 리플 방지하기]에 있는 아이디어로 간단히 구현해 본 스팸 로봇 방지 대책.
페이지 편집 화면과, comments 매크로 시리즈의 출력 양식에 텍스트 필드를 하나 추가한다. 이 필드는 div 태그로 둘러쌓여 있는데 이 태그의 스타일은 "display:none"이 적용되어 있어서 기본적으로 웹브라우저에서는 보이지 않는다.
즉 사람 눈에는 보이지 않는 필드인데, 스팸봇이 만일 웹 페이지 소스를 읽어서 분석을 한다면 봇에게는 보일 것이다. 만일 이 필드에 텍스트가 들어가서 submit되면, 스팸으로 간주하고 거부한다.
이 필드의 name은 "homepage"로 하였다. 봇이 과연 필드의 이름까지 보면서 값을 넣을지 말지 판단할지는 모르겠지만...
1.2. 문제점 또는 부작용
만일 스타일 적용이 되지 않는 텍스트 브라우저 같은 것으로 볼 경우는 해당 필드가 사람 눈에 보이므로 괜히 값을 넣었다가 스팸 취급 당할 수 있겠다.
만일 봇이 페이지에 들어와서 submit을 발생시키는 게 아니라, 미리 만든 필드값들을 가지고 곧바로 저장 요청을 전송하는 형태라면 소용없겠다.
봇이 div태그의 스타일까지 읽어서 이게 함정이란 걸 파악할 수 있을까? 있다면 역시 소용없겠다.
봇이 아니라, 알바생이 스팸을 입력하는 거라면? -_-?? 역시 소용없겠다.
1.3. wiki.pl 수정
일단은 상당히 단순하게 html 소스 자체에다가 display:none 스타일까지 들어가 있게 구현했다. 리카넷 소스를 보니 일단 출력하고 뒷쪽 자바스크립트에서 해당 필드의 스타일을 바꿔주던데, 위키의 경우는 한 페이지에 코멘트나 스레드 매크로가 몇 개 나올지 모르니 일일이 이름을 지정해 주기 힘들어서 일단 보류.
div에는 class만 명시해 놓고, display 스타일은 스타일쉬트에서 적용하는 것도 생각해봄직 한데, 스타일까지 읽는 봇이라면 css 파일도 분석하지 않을까 싶기도 함.
페이지 편집의 경우:
sub DoEdit {
...
my $ecode = &simple_crypt(length($id).substr(&CalcDay($Now),5));
print &GetHiddenValue("ecode","$ecode")."\n";
my $spambot_trap =
"<DIV style='display:none;'>"
. "Homepage: "
. $q->textfield(-name=>"homepage",
-class=>"comments",
-size=>"10",
-maxlength=>"80",
-default=>"")
. "</DIV>";
print $spambot_trap;
if ($section >= 1) {
...
}
sub DoPost {
...
if (($ecode ne $code_today) && ($ecode ne $code_yesterday)) {
&ReportError("SPAM editing");
return;
}
my $trap = &GetParam("homepage", "");
if ($trap ne "") {
&ReportError("SPAM editting caught in trap");
return;
}
...
}
코멘트 매크로의 경우:
sub MacroComments {
...
my $spambot_trap =
"<DIV style='display:none;'>"
. "Homepage: "
. $q->textfield(-name=>"homepage",
-class=>"comments",
-size=>"10",
-maxlength=>"80",
-default=>"")
. "</DIV>";
$txt =
$q->startform(-name=>"comments",-method=>"POST",-action=>"$ScriptName") .
...
$name_field . " " .
$spambot_trap .
T('Comment') . ": " .
...
}
코멘트 매크로로 들어온 내용을 저장하는 것은 comments.pl 쪽에서 수정
1.4. action/comments.pl 수정
sub action_comments {
...
if (($ccode ne $code_today) && ($ccode ne $code_yesterday)) {
&ReportError("SPAM comment");
return;
}
my $trap = &GetParam("homepage", "");
if ($trap ne "") {
&ReportError("SPAM comment caught in trap");
return;
}
...
}
1.5. 추가 업데이트 내역
3일 정도 지켜보니 이 상태에서도 꽤 효과가 있길래, 수정 없이 그냥 ext2.8에 올립니다.
아이디어 재미있네요. ^^ -- H 2007-5-30 4:15 am
- ^^ 안녕하세요, 새벽 4시에 코멘트가 달렸길래 순간 "스팸 방지 얘기를 하는 곳에 스팸이 달리다니 ㅠ,.ㅠ"하고 놀랬습니다. ^^;; 아이디어도 재밌고 나름대로 효과도 있더군요.
오늘 스팸이 있어서 "이럴수가 이것도 소용이 없는것인가!"했었는데, comments.pl 을 업뎃안했었군요.
- 아 역시? 저도 바벨 갔다가 "흐미.. 그걸 또 뚫는 애들도 있나보네"라고 기겁했는데... ^^
처음 1주일은 완벽하게 막는 듯 보였으나, 2주째부터 이것을 뚫고 들어오는 스팸이 있음. 필드 수를 늘려볼까...
위키위키분류