)
=== # 장단점이랄까, 암튼 생각해볼 문제 ===
* 사용자가 별도의 필드에 값을 채워넣을 필요가 없다는 건 확실히 장점
* 당연히... 직접 웹브라우저로 페이지 띄워놓고 Ctrl+V로 붙여놓고 확인 눌러서 스팸 올리는 경우는 못 막는다. 특히나 [[조프]]님이나 [[Nyxity]]님 홈페이지에 달리는 한글 광고들은 봇을 쓰는건지 직접 다는 건지를 잘 모르겠다.
* 봇은 얼마나 자주 페이지 파싱, 분석, 값 얻어내기 등을 할까? 알록블록에서는 ''임의의 블로그에 스팸 코멘트를 전송하기 위해, 이런 비싼 자원(시간+CPU)을 낭비하면서 시도하진 않으리라는 계산이 깔려있습니다''라고 하는데, 주인장은 반대로 "스패머들이 그런 고민까지 할 것인가"라는 의문이 듭니다. 어쩌면 스팸 한 번 보낼때마다 페이지 파싱을 하고 있는지도? -_-;
=== # wiki.pl 수정 ===
이미 아래 있는 구버전의 구현을 수작업으로 적용한 사이트가 있다면, 다시 원래대로 되돌려 놓고 다음의 수정을 적용해야 합니다. -.-;
{{{#!vim perl
sub MacroComments {
...
my $submit_button;
# CCode - 이 줄 추가
my $ccode = &simple_crypt(length($id).substr(&CalcDay($Now),5));
if ($long) {
...
&GetHiddenValue("up","$up") .
# 아래 줄 추가
&GetHiddenValue("ccode","$ccode") .
(($threadindent ne '')?&GetHiddenValue("threadindent",$threadindent):"") .
...
}
}}}
아래 함수는 통채로 추가
{{{#!vim perl
# 인자를 $HashKey를 salt로 하여 crypt하고, 앞의 두 바이트 제외하여 반환
sub simple_crypt {
my ($orig) = @_;
my $encrypt = crypt($orig, $HashKey);
return substr($encrypt, 2);
}
}}}
=== # action/comments.pl 수정 ===
{{{#!vim perl
sub action_comments {
...
my $anchor;
my $match = 0;
# 이 줄은 스팸과는 관계없는데 덩달아 수정
return if (!&ValidIdOrDie($id));
# ccode - 이 단락 추가
my $ccode = &GetParam("ccode", "");
my ($code_today, $code_yesterday);
$code_today = &simple_crypt(length($id).substr(&CalcDay($Now),5));
$code_yesterday = &simple_crypt(length($id).substr(&CalcDay($Now - 86400),5));
if (($ccode ne $code_today) && ($ccode ne $code_yesterday)) { # spam
&ReportError("SPAM comment");
return;
}
# 여기까지
# 금지단어 처리는 여기서 먼저
if (my $bannedText = &TextIsBanned($newcomments)) {
print &GetHeader("", T('Editing Denied'),"");
print Ts('Editing not allowed: text includes banned text');
print " [$bannedText]";
print "\n
". T('This is the text you submitted:').
"
". T('(Copy the text, go back with your browser, paste the text, and edit again please)').
"
".
&GetTextArea('text', $newcomments, &GetParam("editrows", 20), &GetParam("editcols", 65)).
"
\n";
print &GetCommonFooter();
return;
}
# 블로그 지원을 위한 꽁수
...
}
}}}
== # 스팸 트랙백 막기 ==
TrackBack의 경우도 동일한 아이디어로 처리한다. 트랙백 주소에 "tc=******" 라는 항목이 추가되었고, 이 tc의 값은 페이지 이름과 그 날의 날짜에 의해 달라진다. 트랙백 주소는 당일날과 그 다음날까지 유효하므로, 봇이 페이지를 읽어서 트랙백 주소를 얻어내더라도, 그 페이지에 한해서 그 다음날까지만 보낼 수 있다. (봇이 스팸 테러를 하기에는 충분히 넉넉한 기간이긴 하다 -_-;)
=== # 부작용 ===
이제는 특정 페이지의 트랙백 주소가 날짜에 따라서 달라진다는 얘기고, 따라서 페이지의 메타 정보에 트랙백 주소를 넣거나 하는 경우에 문제가 됩니다. (2007.1.8 현재 이곳의 위키에는 그런 기능이 없습니다만) 즉 그런 메타정보를 읽어서 자동으로 트랙백을 쏴줄수 있는 그런 프로그램을 통해서 트랙백을 보내는 것은 힘들어진다는 거죠. alogblog에서도 언급하고 있고, 거기서는 일단 트랙백을 받아서 DB에만 저장하고 웹페이지에는 반영을 하지 않은 다음에, 관리자가 직접 판단해서 반영 여부를 결정하게 하였더군요. 여기서는... 그때가 되면 생각하기로 합시다. :-)
=== # wiki.pl 수정 ===
{{{#!vim perl
sub GetTrackbackGuide {
...
my $encoded = &EncodeUrl($id);
# TCode
my $tcode = &simple_crypt(length($id).substr(&CalcDay($Now),5));
# my $url = $FullUrl . &ScriptLinkChar() . "action=tb&id=$encoded"; 이 줄 아래처럼 수정
my $url = $FullUrl . &ScriptLinkChar() . "action=tb&tc=$tcode&id=$encoded";
if (&PageCanReceiveTrackbackPing($id)) {
...
}
}}}
=== # action/tb.pl 수정 ===
{{{#!vim perl
sub action_tb {
...
my $excerpt = &GetParam('excerpt');
# tcode - 이 아래 두 단락 추가
my $tcode = &GetParam('tc',"");
my ($code_today, $code_yesterday);
$code_today = &simple_crypt(length($id).substr(&CalcDay($Now),5));
$code_yesterday = &simple_crypt(length($id).substr(&CalcDay($Now - 86400),5));
if (($tcode ne $code_today) && ($tcode ne $code_yesterday)) { # spam
&SendTrackbackResponse("1", "SPAM trackback");
return;
}
# 여기까지
# UTF-8 -> EUC-KR 전환
...
}
}}}
== # 페이지를 통채로 수정해 버리는 WikiSpam 막기 ==
UseMod:WikiSpam""도 같은 방식으로 막을 수 있지 않을까 기대를 하며...
만일 수작업으로 페이지 수정을 들어가서 바꾸는 거라면 못 막고... 봇이 그 과정을 그대로 따라하는 거라면 역시 못 막는다. -_-;
=== # wiki.pl 수정 ===
페이지 편집 화면에 tcode 히든 필드를 삽입
{{{#!vim perl
sub DoEdit {
... 한참 아래로 내려가서
if ($canEdit) {
###
###############
print &GetHiddenValue("title", $id), "\n",
&GetHiddenValue("oldtime", $pageTime), "\n",
&GetHiddenValue("oldconflict", $isConflict), "\n";
if ($revision ne "") {
print &GetHiddenValue("revision", $revision), "\n";
}
# ECode - 여기 두 줄 추가
my $ecode = &simple_crypt(length($id).substr(&CalcDay($Now),5));
print &GetHiddenValue("ecode","$ecode")."\n";
###
print &GetTextArea('text', $oldText, $editRows, $editCols);
}
}}}
페이지를 저장할 때 코드 확인
{{{#!vim perl
sub DoPost {
my $string = &GetParam("text", undef);
my $id = &GetParam("title", "");
my $summary = &GetParam("summary", "");
my $oldtime = &GetParam("oldtime", "");
my $oldconflict = &GetParam("oldconflict", "");
# ECode - 아래 두 단락 추가
my $ecode = &GetParam("ecode","");
my ($code_today, $code_yesterday);
$code_today = &simple_crypt(length($id).substr(&CalcDay($Now),5));
$code_yesterday = &simple_crypt(length($id).substr(&CalcDay($Now - 86400),5));
if (($ecode ne $code_today) && ($ecode ne $code_yesterday)) { # spam
&ReportError("SPAM editing");
return;
}
### 여기까지
DoPostMain($string, $id, $summary, $oldtime, $oldconflict, 0);
return;
}
}}}
== # comments 와 thread 매크로 스팸막기 (구버전) ==
[[/Comments매크로]], [[/Thread매크로]]를 사용하여 쉽게 커멘트를 달 수 있게 했더니만 스팸이 기승을 부리는 터라... 조금이라도 막아보자는 취지에서 입력 필드 하나를 추가하였음.
* 필수 요구 사항: 없음
* 선택 요구 사항: 없음
=== 사용법 ===
config 파일에 다음 변수가 추가되었다.
{{{#!vim perl
$AntiSpam = ''; # String used in anti-spam check (for comments)
}}}
* 이 변수의 값이 존재하지 않는 경우(위와 같은 경우, 디폴트)는 기존과 다를 바 없다.
* 변수의 값이 존재할 경우는, comments, longcomments, thread 매크로가 치환되어 나타나는 입력 필드에 기존의 "이름" "내용" 필드 말고 "스팸방지" 필드가 추가로 보인다.
** 커멘트를 달고 싶은 사람은 그 필드에 $AntiSpam 변수의 값을 입력해야 한다.
** 당연히 방문자가 그 값을 알 수 있을 리 없으니, 그냥 텍스트로 옆에 설명이 달린다. 즉 받아 적으면 된다.
** 사용예는 아래 사용자 의견 항목을 보면 쉽게 알 것이고
** 스팸방지 키워드는 대소문자 구분을 하지는 않는다.
=== 부작용 ===
* 커멘트 다는 사람 입장에서는 매우 귀찮다. :-/
* 스팸방지 필드를 실수로 누락한 채로 확인 버튼을 누르면 썼던 글이 다 날아갈 것이다. :-$
=== wiki.pl 수정 ===
{{{#!vim perl
###############
### added by gypark
### 패치를 위해 추가된 환경설정 변수
use vars qw(
$UserGotoBar $UserGotoBar2 $UserGotoBar3 $UserGotoBar4
...
$AntiSpam # 추가
);
###
###############
}}}
comments 매크로의 경우 스팸 방지 필드가 추가되면 한 줄에 너무 길게 필드가 배치되기 때문에, 기본으로 두 줄로 배치되도록 고쳤다. 이름 필드의 길이도 조절. 따라서 MacroComments 함수의 경우 이것저것 바뀐게 많아 일일이 설명을 달지 못하니 아래 diff 를 보고 참고할 것.
{{{#!vim diff
@@ -2923,7 +2925,7 @@
}
my ($hidden_long, $readonly_true, $readonly_style, $readonly_msg);
- my ($name_field, $comment_field);
+ my ($name_field, $comment_field, $antispam_field);
my $submit_button;
if ($long) {
@@ -2936,11 +2938,18 @@
$readonly_msg = T('Comment is not allowed');
$name_field = $q->textfield(-name=>"name",
-class=>"comments",
- -size=>"10",
+ -size=>"15",
-maxlength=>"80",
-readonly=>"$readonly_true",
-style=>"$readonly_style",
-default=>"$idvalue");
+ $antispam_field = $q->textfield(-name=>"antispam",
+ -class=>"comments",
+ -size=>"15",
+ -maxlength=>"80",
+ -readonly=>"$readonly_true",
+ -style=>"$readonly_style",
+ -default=>"");
if ($long) { # longcomments
$comment_field = $q->textarea(-name=>"comment",
-class=>"comments",
@@ -2950,9 +2959,9 @@
-style=>"$readonly_style",
-default=>"$readonly_msg");
} else { # comments
- $comment_field = $q->textfield(-name=>"comment",
+ $comment_field = "
".$q->textfield(-name=>"comment",
-class=>"comments",
- -size=>"60",
+ -size=>"80",
-readonly=>"$readonly_true",
-style=>"$readonly_style",
-default=>"$readonly_msg");
@@ -2961,9 +2970,14 @@
} else { # 에디트 가능
$name_field = $q->textfield(-name=>"name",
-class=>"comments",
- -size=>"10",
+ -size=>"15",
-maxlength=>"80",
-default=>"$idvalue");
+ $antispam_field = $q->textfield(-name=>"antispam",
+ -class=>"comments",
+ -size=>"15",
+ -maxlength=>"80",
+ -default=>"");
if ($long) { # longcomments
$comment_field = $q->textarea(-name=>"comment",
-class=>"comments",
@@ -2971,14 +2985,15 @@
-cols=>"80"
-default=>"");
} else { # comments
- $comment_field = $q->textfield(-name=>"comment",
+ $comment_field = "
".$q->textfield(-name=>"comment",
-class=>"comments",
- -size=>"60",
+ -size=>"80",
-default=>"");
}
$submit_button = $q->submit(-name=>"Submit",-value=>T("Submit"));
}
+ my $antispam_info = Ts("Please fill '%s' in this filed", $AntiSpam);
$txt =
$q->startform(-name=>"comments",-method=>"POST",-action=>"$ScriptName") .
&GetHiddenValue("action","comments") .
@@ -2988,6 +3003,8 @@
(($threadindent ne '')?&GetHiddenValue("threadindent",$threadindent):"") .
T('Name') . ": " .
$name_field . " " .
+ (($AntiSpam ne '')?T('Anti-Spam') . " ($antispam_info): " . $antispam_field:"") .
+ " " .
T('Comment') . ": " .
$hidden_long .
$comment_field . " " .
}}}
=== action/comments.pl 수정 ===
{{{#!vim perl
sub action_comments {
...
my $anchor;
my $match = 0;
# 아래 한 줄 추가
my $antispam = &GetParam("antispam", "");
...
my ($threshold1, $threshold2) = (100000000, 1000000000);
# 아래 한 줄 수정
if ((lc($antispam) ne lc($AntiSpam)) || ($newcomments =~ /^\s*$/)) {
&ReBrowsePage($pageid, "", 0);
return;
}
$name = &GetRemoteHost(0) if ($name eq "");
...
}}}
=== translations/korean.pl 수정 ===
{{{
Anti-Spam
스팸방지
Please fill '%s' in this filed
다음 칸에 '%s'을 입력하세요
}}}
== # 추가 업데이트 내역 ==
ext1.101 - 완전히 내용이 바뀜. 사용자가 추가로 코드를 넣는 방식을 없애고, 자동으로 확인 필드를 삽입하도록 함.
ext1.102 - 트랙백 관련 코드에도 적용.
* 코멘트든 트랙백이든 CalcDayNow 와 CalcDay 가 혼용되는게 보기 안 좋아서 CalcDay 를 쓰도록 고쳤습니다. 이건 뭐 굳이 다시 고칠 필요는 없음.
ext1.102a - ccode와 tcode를 생성할 때 사용하는 인자로, "페이지 이름의 길이"와 오늘 날짜를 나타내는 문자열 중 "월-일" 부분을 합쳐서 사용하도록 수정.
ext1.103 - 페이지 수정 관련 코드에도 적용.
ext1.103a - 커멘트의 중간에 등록 금지 단어가 있는 경우에, 커멘트 저장은 안 되면서 BlogRc 페이지는 고쳐지는 문제 수정
ext1.109c
* 사용자가 본의 아니게 금지어를 포함한 코멘트를 달았을때, 작성했던 내용을 전부 날려버리는 문제를 수정. (자세한 내용은 [[/등록금지단어]]의 추가 업데이트 내역 참조)
== # 로그 남기기 ==
이 패치로 얼마나 스팸을 막을 수 있는지 로그를 남겨서 보려고 코드를 수정해 보았습니다. 이건 배포용 소스에는 넣기가 그래서 여기에 수정 내용을 적어 둡니다. 제 위키와 조프위키, 바벨 셋 중에서 가장 스팸에 시달리던 곳이 바벨인지라, 바벨에 적용해 보고 일주일쯤 후에 로그파일을 한번 살펴보면 어떨까 싶어요.
코멘트와 트랙백의 경우는, 원래 있는 소스를 고치지 말고, action/ 디렉토리 아래 있는 comments.pl과 tb.pl을 myaction/ 디렉토리로 복사한 후에, myaction 아래 있는 걸 고치면 편하겠습니다. 아니면 그냥 아래 링크에서 다운로드해서 myaction 디렉토리에 넣으셔도 됩니다. 나중에 myaction 아래 있는 걸 지우면 원상복귀 되니까요. 페이지 수정의 경우는 wiki.pl 을 직접 고쳐야 하는 터라 그러지 못하겠네요.
코멘트는 myaction/comments.pl : Upload:comments.txt.txt (뒤의 .txt.txt 를 .pl로 바꿀것)
{{{#!vim perl
if (($ccode ne $code_today) && ($ccode ne $code_yesterday)) { # spam
### begin of logging routine - 이 단락 추가
my ($authorAddr) = $ENV{REMOTE_ADDR};
my ($timestamp) = CalcDay($Now) . " " . CalcTime($Now);
if (open (LogFile, ">>$DataDir/__spam__")) {
printf (LogFile "C|%-19s|%-15s|%s\n", $timestamp, $authorAddr, $id);
close LogFile;
}
### end of logging routine
&ReportError("SPAM comment");
return;
}
}}}
트랙백은 myaction/tb.pl : Upload:tb.txt.txt (뒤의 .txt.txt 를 .pl로 바꿀것)
{{{#!vim perl
if (($tcode ne $code_today) && ($tcode ne $code_yesterday)) { # spam
### begin of logging routine
my ($authorAddr) = $ENV{REMOTE_ADDR};
my ($timestamp) = CalcDay($Now) . " " . CalcTime($Now);
if (open (LogFile, ">>$DataDir/__spam__")) {
printf (LogFile "T|%-19s|%-15s|%s\n", $timestamp, $authorAddr, $id);
close LogFile;
}
### end of logging routine
&SendTrackbackResponse("1", "SPAM trackback");
return;
}
}}}
페이지 수정은 wiki.pl 수정
{{{#!vim perl
if (($ecode ne $code_today) && ($ecode ne $code_yesterday)) { # spam
### begin of logging routine
my ($authorAddr) = $ENV{REMOTE_ADDR};
my ($timestamp) = CalcDay($Now) . " " . CalcTime($Now);
if (open (LogFile, ">>$DataDir/__spam__")) {
printf (LogFile "E|%-19s|%-15s|%s\n", $timestamp, $authorAddr, $id);
close LogFile;
}
### end of logging routine
&ReportError("SPAM editing");
return;
}
}}}
세 군데 다 완전히 동일한 코드이고 딱 하나 printf 에 보면 따옴표 직후에 C, T, E만 다릅니다. 만일 스팸이 이 패치에 의해 걸러지게 되면 위키 데이타가 있는 디렉토리($DataDir)에 __spam__ 이란 파일에다가 아래와 같이 로그를 남길 겁니다.
{{{#!vim
T|2007-1-10 12:13 am |220.80.107.90 |연습장 <-- T는 트랙백을 의미, 그 다음은 날짜, IP주소, 페이지
}}}
== # 사용자 의견 ==
트랙백에도 마찬가지로 응용해서, 트랙백 주소에 이 ccode값을 포함하면 될 것 같습니다. 그러나 스팸봇이 매번 페이지를 읽고 트랙백주소를 얻어간다면 무용지물이겠지요. 그래서 일단은 그제 올린 수정(트랙백 주소의 action값만 바꾼)이 얼마나 잘 통하는지를 관찰을 좀 해볼까 싶어요. 제일 스팸트랙백에 시달리던 바벨의 도서관이 마침 어제 그 수정을 했으니, 얼마나 오래 견디는지 좀 구경했으면 (^^;) 좋겠네요. \\
\\
오후쯤에 트랙백에도 적용한 코드를 올리긴 하겠습니다만, 그 트랙백 패치는 바벨에 적용하는 건 며칠 미뤄주시면 좋겠습니다. 이 페이지에 있는 코멘트 패치는 바로 적용하셔도 될 듯. 딱히 부작용은 없을 것 같네요. 혹시 구현에 문제가 있다면 조프님이 보고 발견해줄거라 기대를... ^^;
:알겠습니다. 매번 감사~
action/comments.pl 에서 저는 \\
my $anchor; \\
my $match = 0; \\
이게 없던데, 이것도 추가해 줘야 하나요?
comments.pl 전체에서 그 두 변수가 쓰이는 곳이 없다면 없어도 됩니다. anchor는 스레드 댓글을 달았을때 바로 그위치로 이동하는 것이고, match는 comment 매크로가 없는 페이지에 스팸봇이 코멘트를 달았을때 blogrc 페이지만 갱신되는 것을 막으려고 넣은 것이니 둘 다 있는 게 나을 듯 합니다. 그냥 comments.pl 은 그대로 가져다 쓰셔도 되지 않을런지. (따로 수정하신 게 있다면 그 부분은 옮겨 주셔야겠지만)
: 으윽, 서버의 시계가 너무 빨라서 늦췄더니만, 코멘트 작성 시각이 엇갈렸군요. 뭐 별 문제 없겠지...
:: 아 걍 가져다 쓰면 되는군요. 그 방법을 생각못했네.
나 원 -_-; 이 패치 적용하고 반나절도 안 되어서 스팸 코멘트가 TrackBack 페이지에 줄줄줄... 진짜 매번 웹페이지 가져오는겐가? -_-;;;
으윽, 바벨도 오늘 스팸트랙백이 하나 날라왔던데... 전에 비하면 양호한 것 같기도 하지만... 진짜 그 자바스크립트 써서 코드값을 감추기까지 구현해야 하려나요 =.=;
:그렇긴 한데, 기존 시달리던 페이지랑은 다른 페이지라서..
:: 네 사실 그래서 약간은 안도했어요. 아직 트랙백 패치를 안 하신 상태이니. 오히려 제 홈에 스팸 코멘트가 매우 불길하군요. :-)
맙소사.. -_- 날짜가 바뀌면서 code값이 바뀌는 걸 확인하려 했는데 바뀌지를 않더군요. 펄과 C에서 제공하는 crypt 함수는 스트링의 앞 8바이트만 가지고 결과를 만들어 낸다는 걸 방금 매뉴얼 보고 알았습니다. ㅠ,.ㅠ
: crypt의 인자가 8바이트 이하가 되도록 수정했습니다.
그러고보니... 이거 페이지를 수정할 때도 적용하면 페이지를 통채로 수정하는 WikiSpam도 막을 수 있지 않을까 하는 생각이...
일단 반영해 보았고... 슬쩍 이 GyparkWiki의 EditAllowed 옵션 값을 바꿔서 로그인하지 않은 사람도 수정이 가능하도록 해 보았습니다. (이 한 몸 실험 대상으로 내어놓아...) 좀 지켜볼 예정인데, 워낙 인기없는 사이트라서 과연 :-)
아 제 바벨에서 코멘트를 달려고 하니 금지단어가 있어서 수정불가라고 하는데 금지단어는 페이지에 없는 단어이거든요. 근데 모노로그 코멘트란에 보면 다양한 스팸코멘트들이 달려고 했던 시도들이 보이더군요. 그래서 그런 기록이 남아서 그런게 아닐까 멋대로 추측을 하는데, 꽤 당황했어요.
바벨에 오늘도 스팸이 보이던데... \\
\\
알록블록의 구현처럼 자바스크립트를 써서 code를 감추는 방법을 추가로 구현한다 하더라도, \\
1) 스팸이 줄어도 정말 그 감추기 덕분에 스팸이 주는 것인지 확인하기 힘들고 \\
2) 결정적으로 페이지 편집이나 트랙백은 몰라도, [[횡설수설]] 같이 한 페이지 내에 코멘트창이 수십개 들어있는 곳에서는 매번 서버 쪽에서 감추기 코드를 생성하고 클라이언트 쪽에서는 자바스크립트가 그 계산을 해야 한다는 게 참 성능에 저하가 될 것 같습니다. \\
\\
이래저래 고민이네요.
: 그 로그파일에 뭐 좀 남는게 보이면 그나마 기분이라도 좋을텐데 제 홈의 경우는 몇 시간이 지나도 전혀 없군요 흐...
오옷 어제 밤에 세 차례 스팸 코멘트 시도가 있었다가 이 패치에 의해 무산되었었군요. 헛되지 않았어.. ㅠ,.ㅠ
제 모노르그에 함 커멘트 달아주시겠어요? 자꾸 등록금지단어 달었던 기록이 남아선지..
참. 적용은 했어요
: 아... 모노로그 하위 페이지인 BlogRc 페이지에 문제가 있었네요. 스팸트랙백을 예전에 받으면서 거기에 그 트랙백 내용이 적혔고, 그 이후에 금지단어 목록에 그게 추가되니까, 이후에는 정상적인 코멘트를 달 경우 코멘트는 제대로 저장이 되는데, BlogRc를 갱신하려고 하는데 이미 내용에 금지단어가 들어가 있으니 거기서 문제가 되었네요. 그 라인을 지워주었으니 이제 잘 될 겁니다 ^^ BlogRc 페이지도 종종 들여다보면서 스팸 찌꺼기를 지워주시면 좋을 듯 하네요. (애초에 블로그 흉내 내려고 편법으로 우겨넣은 거다보니 관리에도 좀 신경쓸게 많군요 ^^;)
::아 거기를 보면되는 것이었군요. 감사감사
로그파일을 보니 2월26일 이후에 막지 막지 못하는 듯 하군요.
: 뭐 이곳도 하루에 하나 이상 꼬박꼬박 받고 있다보니 -_-; 이거 영 잘 안 돌아가는 것 같기도하고... 한글 스팸들은 매일 사이트 직접 찾아와서 폼에 데이타 넣고 submit하는 것 같기도 하고... 저도 잘 모르겠어요, 딱히 날짜 때문에 제대로 동작하지 않는 건 아닌것 같은데.
:::역시 부지런히 등록금지단어 등록밖에..
언제부턴가 매일 여기에 걸리는 스팸 트랙백이 300여개에 달해서, 아주 뿌듯해하고 있었는데... 로그를 보니 이게 다 구글의 IP였다 -_-;;; 스팸을 남기려 한 게 아니라 URL이 있으니 그냥 크롤링 하려고 했었나본데, 트랙백 주소는 링크가 아니라 텍스트로 남아 있는데 이걸 왜....
----
[[위키위키분류]]