-
- 1. 등록 금지 단어 필터링 기능
-
-
- 1.1. 사용법
-
- 1.2. 부작용
-
- 1.3. wiki.pl 수정
-
- 1.4. action/editbannedtext.pl 추가
-
- 1.5. action/updatebannedtext.pl 추가
-
- 1.6. action/adminmenu.pl 수정
-
- 1.7. action/comments.pl 수정
-
- 1.8. translations/korean.pl 수정
-
- 1.9. 관련 링크
-
- 1.10. 추가 업데이트 내역
-
- 1.11. 사용자 의견
-
1. 등록 금지 단어 필터링 기능
위키에 WikiSpam을 올리는 인간들이 많은데 IP차단만으로는 한계가 있어서, 텍스트에 특정한 단어가 들어가 있으면 저장을 거부하는 기능을 넣음.
UseModWiki소스수정/TextIsBanned의 코드를 수정해서 적용함.
- 필수 요구 사항:
- /액션모듈화가 되어 있을 것. 아닐 경우 아래의 action들을 wiki.pl에 추가해 줌.
- /TrackBack 패치 중에 GetParam()함수의 수정이 되어 있어야 한다.
- 선택 요구 사항:
- wiki.pl?action=editbannedtext 를 띄우거나, /관리메뉴가 되어 있으면 상단 메뉴바에서 관리-등록 금지 단어 목록 수정
- 단어 목록에는 Perl/정규표현식을 사용할 수 있다.
- 글을 저장할 때 본문에 해당 단어가 들어 있으면 저장이 되지 않는다.
- [금지 단어로 사용할만한 목록] - 외국 사이트들도 어지간히 당했었나보다.
모름 :-)
다른 블로그 사이트에서 위키에 TrackBack을 보낼 때 트랙백 내용 안에 금지 단어가 들어가 있으면 트랙백도 거부하는데, 블로그 사이트 쪽에서 제대로 에러 내용을 보여주는 곳이 드물어서 보낸 사람 쪽에서는 영문도 모르고 트랙백 보내기가 실패하는 경우가 생길 수 있다.
1.3. wiki.pl 수정
sub DoPostMain {
...
return;
}
if (my $bannedText = &TextIsBanned($string)) {
print &GetHeader("", T('Editing Denied'),"");
print Ts('Editing not allowed: text includes banned text');
print " [$bannedText]";
print "\n<br><hr noshade size=1><p><strong>". T('This is the text you submitted:').
"<br>". T('(Copy the text, go back with your browser, paste the text, and edit again please)').
"</strong><p>".
&GetTextArea('text', $string, &GetParam("editrows", 20), &GetParam("editcols", 65)).
"<p>\n";
print &GetCommonFooter();
return;
}
if (($id eq 'SampleUndefinedPage') || ($id eq T('SampleUndefinedPage'))) {
&ReportError(Ts('%s cannot be defined.', $id));
return;
...
}
다음 함수 통채로 추가
sub TextIsBanned {
my ($text) = @_;
my ($data, $status);
($status, $data) = &ReadFile("$DataDir/bantext");
return undef if (!$status);
$data =~ s/\r//g;
foreach (split(/\n/, $data)) {
next if ((/^\s*$/) || (/^#/));
return $& if ($text =~ /$_/i);
}
return undef;
}
/TrackBack패치가 되어 있는 경우 아래 수정 적용
sub DoReceiveTrackbackPing {
...
} elsif (!&PageCanReceiveTrackbackPing($normal_id)) {
&SendTrackbackResponse("1", "Invalid Pagename (Page is missing, or Trackback is not allowed)");
} elsif (my $bannedText = &TextIsBanned($blog_name.$url.$title.$excerpt)) {
&SendTrackbackResponse("1", "[$bannedText] is a Banned text");
} else {
&OpenPage($normal_id);
...
}
1.4. action/editbannedtext.pl 추가
sub action_editbannedtext {
my ($banList, $status);
print &GetHeader("", T('Editing Banned text'), "");
return if (!&UserIsAdminOrError());
($status, $banList) = &ReadFile("$DataDir/bantext");
$banList = "" if (!$status);
print &GetFormStart();
print &GetHiddenValue("edit_bantext",1),"\n";
print &GetHiddenValue("action", "updatebannedtext"),"\n";
print "<b>Banned text list:</b><br>\n";
print "<p>Each entry is either a commented line (starting with #), ",
"or text.";
print "<p>Example:<br>",
"# blocks text 'spam.com'<br>",
"spam\\.com\$<p>";
print &GetTextArea('bantext', $banList, 12, 50);
print "<br>", $q->submit(-name=>'Save'), "\n";
print $q->endform;
print &GetCommonFooter();
}
1;
1.5. action/updatebannedtext.pl 추가
sub action_updatebannedtext {
my ($newList, $fname);
print &GetHeader("", T('Updating Banned text'), "");
return if (!&UserIsAdminOrError());
$fname = "$DataDir/bantext";
$newList = &GetParam("bantext", "#Empty file");
if ($newList eq "") {
print "<p>Empty banned text or error.";
print "<p>Resubmit with at least one space character to remove.";
} elsif ($newList =~ /^\s*$/s) {
unlink($fname);
print "<p>Removed banned text";
} else {
&WriteStringToFile($fname, $newList);
print "<p>Updated banned text";
}
print &GetCommonFooter();
}
1;
1.6. action/adminmenu.pl 수정
/관리메뉴가 되어 있을 경우 아래 수정 적용
...
"<p>".&ScriptLink("action=editbanned",T('Editing Banned list')).
"<p>".&ScriptLink("action=editbannedtext",T('Editing Banned text')).
"<p>".&ScriptLink("action=maintain",T('Maintenance on all pages')).
...
1.7. action/comments.pl 수정
코멘트 창을 사용한 경우는 따로 처리해 주어야 한다 /Comments와Thread매크로스팸막기를 보라.
1.8. translations/korean.pl 수정
다음 항목 추가
Editing not allowed: text includes banned text
수정할 수 없습니다: 금지된 단어가 포함되어 있습니다
Editing Banned text
등록 금지 단어 목록 수정
Updating Banned text
등록 금지 단어 목록 갱신
(Copy the text, go back with your browser, paste the text, and edit again please)
(아래 텍스트를 복사하고, 브라우저의 뒤로 가기를 사용하여, 이전 화면에 붙여놓고 다시 편집해 주시기 바랍니다)
1.10. 추가 업데이트 내역
ext1.82a - 트랙백을 받았을 때, 본문 뿐 아니라 제목, URL, 블로그이름에서도 금지단어 검사.
ext1.109c
- 사용자가 본의 아니게 등록금지단어에 해당하는 텍스트를 넣은 글을 올리다가, 작성한 내용을 모두 날려버릴 수 있는 문제를 수정
- 대단한 건 아니고, 등록금지에 걸렸을 때는 텍스트 입력폼에 있던 내용을 다시 한 번 출력해준다. 사용자는 그걸 복사한 후 브라우저의 뒤로 가기를 눌러서 편집 화면으로 돌아가서 붙여 넣은 다음에 수정을 하면 된다.
- (금지에 걸렸을 때 바로 편집화면을 다시 띄울 수 있으면 훨씬 좋았겠지만, 그러자면 수정할 코드가 너무 많고 복잡해져서.. 이 정도로 절충합니다)
등록금지 단어 필터링 패치하였습니다.
그리고 이 패치에 대한 질문은 아니지만 editbanned에 대한 질문이 있습니다.
action=editbanned 에서
^209.158.164.11$
^213.229.159.18$
^163.17.101.125$
^148.244.150.58$
^148.244.150.
^210.8.163.85$
^61.55.128.199$
^83.65.7.162$
^165.138.175.85$
#148.244.150.58
이런 식으로 등록하였는데 148.244.150.58 에서 계속 스팸이 올라오는데요.
형식을 잘 못 쓴 건가요?
- "#"으로 시작하는 것은 주석문이라는 얘기입니다. 즉 그 줄은 무시되지요. # 대신에 ^를 쓰셔야겠죠. :-)
음, 스팸중에 "url="이라는 문구가 들어간게 많아서 금지 단어에 설정해 뒀다가, 그게 wiki 소스에도 들어있는 터라 페이지 수정하던 거 날려먹었네요. =.=; 금지 단어가 포함되어서 저장이 거부되더라도 쓰던 내용을 잃지 않게 고민 좀 해봐야겠습니다. 페이지 편집의 경우는 다시 편집 화면으로 돌아가게 할 수 있을 법 한데, 코멘트는 어찌해야 되려나 모르겠네요. (트랙백이야 뭐 별 수 없고)
anth를 금지어로 했더니 panther가 걸리네요. anth만 걸리고 panther는 안걸린다거나..
anth$$ an*th 등의 정규식 표현식으로 하는 건 어려울까요?
- 어려울리가요! :-) "\b"라는 앵커는 단어의 끝을 의미합니다.
"anth"라는 단어만 잡고 싶으면 \banth\b 를 넣어 보세요. anth.com 처럼 특수기호가 붙은 경우도 단어의 끝으로 간주해서 잡아냅니다.
- 아 그렇군요!
여전히 스팸이 들어오고 있는데요..
저기 "^61\.55\.128\.199$ "에 $뒤에 빈칸이 하나 있어야 Banned list가 작동을
하는 건가요??
"^61\.55\.128\.199$"라고 적어두어도 계속 트랙백이 들어오거든요. -- Redica 2007-4-10 7:24 pm
음 아뇨 $뒤에 빈칸 갈은 건 상관없습니다.
혹시나 해서 여쭈는 건데, IP차단하고 금지단어 차단 메뉴를 혼동하신 건 아니시고요?
- 간혹 IP차단해도 들어오는 녀석들이 있긴 있더군요.
그렇군요.. 같은 아이피가 계속 들어와서요.. 그냥 수작업으로 계속 지워줄 수 밖에 없군요. -- Redica 2007-4-11 10:58 am
위키위키분류