CCode - 코멘트 스팸 방지 플러그인 

Simple View | Forum View

CCode는 SCode라고 하는 무버블타입용 코멘트 스팸 방지 플럭인 이름을 패러디(?)해서 붙인 것입니다. SCode는 코멘트를 입력할 때 이미지로 표현된 숫자 등의 값을 코멘터가 직접 입력하는 방식으로, 스팸로봇이 자동화 방식으로 대량 스팸 코멘트 전송하는 것을 차단하는 방법입니다.

개인적으로 이런 방식이 회원가입 등의 절차에서 일회적으로 사용되는 것은 문제될 게 없지만, 코멘트 입력시마다 별도의 값 입력을 요구하는 것은 자연스럽지 못하다고 생각해왔기에, 예전에 직접 소스 변경(Hack)에 의한 방법(무머블타입에서_코멘트_스팸로봇_왕따시키기)으로 코멘트 스팸을 나름대로 막아왔습니다.

이에 번거로운 소스 수정에 의한 핵(Hack)을 나름대로 체계화시켜, 무버블타입용 플럭인 CCode를 만들게 되었습니다. 실제 적용은 무버블타입에 된 것이지만, 여타 다른 설치형 블로그를 이용하고 또 플럭인 개발 등에 관심/능력이 있는 분들께 작은 아이디어가 될 수 있다 봅니다.

1. CCode 플럭인의 작동 방식

코멘트를 입력하고 보낸다는 것은 코멘트 입력 <form>문에 속한 각종 <input>입력필드에 요구되는 값을 넣고, GET혹은 POST방식으로 지정된 주소로 전송하는 행위입니다. 즉 스팸머의 입장에 볼 때, <form>의 action속성에 나타난 전송주소와 요구되는 입력필드값만 파악하면, 간단한 스크립트만으로 대량전송을 할 수가 있습니다.

  1. 여기서 자연스레 등장하는 방법이 바로 CCode에서 사용하는 방법입니다. 원래 블로그 시스템에서 디폴트로 요구하는 입력필드 외에 새로운 입력필드를 삽입합니다.
  2. 이 입력필드의 요구되는 입력값을 엔트리마다 각각 특정한 알로리즘으로 만들어 주고, 이를 페이지에 나타낼땐, 소위 Obsfucator라는 방법을 통해 Javascript를 이용해 값을 알기 어렵게 변환해서 페이지에 심어줍니다. 예전에 Hack으로 처리했을때는 모든 엔트리에 대해, 이 값이 같았지만, 이번 플럭인 버전에서는 엔트리 마다 값이 다릅니다. (*CCode에서 사용된 Obsfucator는  http://www.jottings.com/obfuscator/ 의 자바스크립트 루틴을 펄로 변환 이용한 것입니다.)
  3. 전송된 커멘트 입력폼 값을 받아 처리하는 특정 루틴에서, 위에서 설정한 속성의 값이 있나 없나? 있다면 그 값은 요구된 값과 일치하는 가를 판단해 스팸여부를 판단하는 방식입니다.

2. CCode 설치

무버블타입 2.661 버전과 3.121 버전에서 테스트를 해봤는데, 3.0D버젼 이후랑 2.661버전 이전이랑 큰 변화가 소스상에 생겼지만, 2.661에서도 잘 작동하는것 같습니다.

소스를 다운받아 풀면 CCode.pl 파일이 하나 생깁니다. 이를 mt/plugins 폴더 아래에 둡니다.

3. 버젼 2.661 에서의 템플릿 적용방법

  • Individual Entry Archive에서 entry_id로 찾기를 해보면,
    <input type="hidden" name="entry_id" value="<$MTEntryID$>" /> 와 같은 부분이 나옵니다. 이 아래에다 <$MTEntryAntiSpamCommentField$> 를 삽입하고 저장합니다.
     
  • Miscellaneous Templates에 세개의 Comment 관련 템플릿이 있습니다. 마찬가지로 각각의 템플릿에서 위와 똑같이 삽입해줍니다.
     
  • 이제 Rebuilding Individual 해주면, 끝입니다. 리빌딩하지 않으면, 향후 새로이 입력하는 엔트리에만 적용되겠죠?
     
  • 리빌딩 후에 스팸 테스트를 한번 재미삼아(?) 해보기 위해, 리빌딩하기 전에 archive/ 폴더에서 기존에 이미 생성되어 있는 아무 페이지를 다른 이름으로 하나 저장해 둡니다. 즉, CCode를 적용하기 전의 엔트리페이지에서 코멘트를 입력하는 것이, 바로 스팸봇이 여분의 입력필드를 인식하지 못하고 디폴트 입력필드만 채워서 전송하는 것과 같은 과정입니다. 리빌딩 한후에 새로운 페이지에서 코멘트를 한번 입력해보고 별 문제없이 코멘트가 달리는지 확인합니다. 앞서 저장해 두었던 페이즈를 열고, 거기서 한번 코멘트를 달아 봅니다. No such entry 머 이런 결과가 나타나는지 한번 봅니다.

4. 버젼 3.0 이후에서의 템플릿 적용방법

  • Individual Entry Archive 에서 entry_id 로 검색해보면,
    <input type="hidden" name="entry_id" value="<$MTEntryID$>" /> 부분이 두군데서 발견이 됩니다. 이 필드아래에 <$MTEntryAntiSpamCommentField$> 를 삽입해 줍니다.
     
  • 메뉴의 Special Templates 부분에 보면, 코멘트에 관한 템플릿 중에 Listing/Previe/Error 이 세개의 템플릿 각각에서,  <MTCommentFields> 를 찾습니다. 바로 이 아래에
    <MTCommentPreviewAntiSpamCommentField> 를 삽입해 줍니다.
     
  • 리빌딩해주면 끝입니다. 위 2.661 설명에서 부분의 내용대로 한번 적용하기전의 엔트리 페이지에서 코멘트를 달아봅니다. No such entry... 이런 내용이 나오면 잘 적용이 된 겁니다.

기타

이 방법은 다른 방법들과 마찬가지로, 스팸봇이 아닌 스팸머가 직접 특정한 엔트리에 방문해서 일정한 시간 간격으로 정상적인 절차로 스팸코멘트를 다는 것은 어쩔 수가 없습니다. 이 경우 엠티에서는 mt.cfg에서 ThrottleSeconds 값을 크게 잡아줘서 방지할 수 있습니다.

Comments

오우~ 좋군요. scode는 매번 입력해야 해서 스팸봇때문에 짜증나지만 설치를 안하고 있었거든요 :)

그런데,

"Miscellaneous Templates에 세개의 Comment 관련 템플릿이 있습니다. 마찬가지로 각각의 템플릿에서 위와 똑같이 삽입해줍니다."

여기서

"Miscellaneous Templates에 세개의 Comment 관련 템플릿이 있습니다."

이거 어디에 있는거죠?

Posted by dukny , 2005년 03월 15일 오후 4:42

아...^^;;
mt.cgi의 맨밑 코멘트 관련 탬플릿 이군요...;;

감사합니다.

Posted by dukny , 2005년 03월 15일 오후 4:51

CCode 설치 후, 리빌딩할 때 다음과 같은 경고메시지가 나옵니다.

Use of uninitialized value in string eqat /home/...개별페이지 경로

에러 메시지가 아니라 경고 메시지 정도로 문제는 없는 것으로 알고 있지만, 나중에 페이지가 늘어나면 늘어난 만큼 메시지가 많아질 테니 해결을 했으면 좋겠습니다. 저뿐만 아니라 다른 분도 같은 문제가 있는 것으로 알고 있습니다. 답변 부탁드리겠습니다.

스펨코멘트 신경 안쓰고 있다가, 오늘 스펨 받았습니다. ^^; 그런데 MT 관리자 모드에서 코멘트 삭제 버튼이 안 먹네요. 페이지 오류 때문인 것 같은데... 스펨을 받아보니 무지 싫네요.

Posted by imtext , 2005년 05월 16일 오전 9:59

안녕하세요

말씀하신 경고는 다른 플럭인이나 이런걸 사용하시다보면 많이 생기게 됩니다. Uninitialzed value...이 경고는 거의 의미가 없습니다. 프로그램상으로 제거 가능한 경우도 있고, 불가능할 수도 있습니다.

근데 다른 여타 플럭인 혹은 mt기본 루틴상에서도 이런 경고가 뜨는데도 불구하고 그 경고를 안없애고 그대로 원 소스를 사용하는 이유는 불필요한 오버로드를 프로그램에 주지 않기위해섭니다. 예를 들어 보겠습니다.

my $name; # 변수선언, 값을 할당하진 않았네요.
...
...
if($name eq '') { # 이름변수에 값이 없다면,
print "이름을 입력하세요";
}

위의 경우에, 사용자가 이름을 입력치 않으면, 입력하라는 메시지를 찍는 내용입니다. 위의 경우도 warning을 줍니다. 왜냐면, if문 검사에서 비교에 $name변수를 사용하지만 그 전에 $name변수에 다른 어떤 값을 초기화하지 않았기때문입니다.
이런 경고를 없앨려면, 모든 변수 선언시에 아무 의미없는 값을 할당하면 됩니다.
즉, my $name=''; # 공백문자 할당.

그런데 이런 할당이 프로그램상의 오버로드 즉 불필요한 공백문자 할당이라는 헛일을 더 하게 되는겁니다. 이게 왜 헛일이냐면 위의 경우에 이미 if문에서 "프로그램루틴상"으로 $name변수의 공백여부를 스스로 체크하고 있기때문입니다.(warning machine(?)은 이런것까지 다 파악해서 경고메시질 주진 못합니다.)

만약 그런 의미없는 경고메시지가 거추장스럽다 생각되시면, mt/mt.cgi의 제일 첫줄의 perl -w 에서 -w를 없애면 됩니다. 이때에도 의미있는 에러의 경우엔 mt자체적으로 표시는 계속 해줍니다.


스팸을 받으셨다고하셔서 가보니, 진성(?) 스팸은 아닌것 같습니다. 그냥 본문 내용을 spam이라고 찍는 스팸은 없거든요. 제 생각엔 한번 방문하신 분이나 혹은 페이지소스를 보고 코멘트작성부분이 조금 특이해서 한번 '테스트' 내지는 '장난'삼아 한걸로 보입니다. 근데 삭제가 안되신다니...

일단 제 플럭인이 하는 동작을 생각해보면 메뉴상에서 삭제와는 관련이 없습니다. 커멘트내용이 디비에 저장되는 단계등 모두 원 엠티루틴이 다 담당합니다. 이 플럭인은 단지 값이 맞나 확인만하는 차원이거든요...

하지만 하필(?) 그 스팸코멘트만 삭제가 안먹히신다니 제가 완전 배째라(^^;;;)하기도 좀 그러니, 한번더 확인해보시고 버튼이 작동안한다는게 어떤 식인지 좀더 구체적으로 증상을 설명해주시면 한번더 궁리해보겠습니다.( 가장 좋은건 제가 imtext님 엠티 메뉴로 들어가서 한번 보는겐데...^^;;; )

Posted by 알록블록 , 2005년 05월 16일 오전 11:52

친절한 답변 감사합니다. 스펨 코멘트 삭제가 안 된다는 것은 말씀대로 저의 MT 문제이지 CCode와는 상관이 없을 겁니다. 신경쓰지 않으셔도 됩니다. 그런데 코멘트 관리에서 모든 코멘트 삭제가 되지 않고 있습니다. (처음 MT설치했을 때부터 문제가 있었을 겁니다. 설절상 오류?) IE에서도 불여우에서도 삭제 버튼만 안 먹히고 있습니다. 왜 그런지는 통 알 수가 없는데, 다른 컴퓨터에서 작동을 시켜봐야겠습니다.

항상 많은 도움을 얻고 있습니다. 감사합니다.

Posted by imtext , 2005년 05월 16일 오후 6:33

comments listing 템플릿에서 에러가 나네요 -.-

::App::Comments=HASH(0x810aa34) Use of uninitialized value in string eq at /home/dukny/mt/plugins/CCode.pl line 145, line 252.

이건 무슨 문제죠?

Posted by dukny , 2005년 07월 26일 오후 4:55

Use of uninitialized value ... 이건 아마 리빌딩하실때, 팝업창의 구석에 나타날건데요, 정확히 에러는 아니고 경고입니다. 말 그대로 어떤 변수에 초기값을 넣지 않고 사용했다는 뜻인데, 프로그램 실행 결과랑은 아무 상관은 없습니다. 이런 메시지가 거추장스러우시면(제 경우 설치한 십여종의 플러그인 각각에서 내뿜는 저 경고가 몇페이지에 달합니다.^^) mt.cgi의 첫 줄에서 perl -w에서 -w(arnig)을 지우시면 됩니다. 프로그램상에서 물론 초기값을 꼬박꼬박 넣어주면 저 경고를 없앨수 있지만, 대부분의 경우 불필요한 오버로드만 가하는 경우가 많아서, 효율적인 면에서 넣지 않고 짭니다.

Posted by 알록블록 , 2005년 07월 26일 저녁 7:14

리빌딩 할 때 팝업창에서 나타나는게 아니라
http://dukny.net/mt/mt-comments.cgi?entry_id=128
여기처럼 페이지 맨 밑 하단에 나타나네요 :(

Posted by dukny , 2005년 07월 26일 밤 9:36

블로그가 무지 깔끔하네요^^
답을 드릴 적당한 포스트가 안보여 여기에 적습니다.

mt-comments.cgi를 직접 페이지 표시에 이용하시나 봅니다.
결국 마찬가지로 모든 cgi에 적용이 되는 말씀입니다. -w를
지우시면 없어질것 같은데요...

Posted by 알록블록 , 2005년 07월 28일 밤 11:46

아..네 감사합니다. CCode 잘 사용하고 있어요 ^^

Posted by dukny , 2005년 07월 29일 오전 9:31

Post a comment

  • PGP/GPG 서명된 코멘트를 지원합니다. ?
  • 이메일 주소는 정중히 사절합니다.
  • 이름(닉네임)/블로그 주소는 필수 입력사항입니다.
  • 이미지는 자기 블로그상의 대문이미지 등을 사용하셔도 좋습니다.
  • 코멘트에 달린 이미지를 클릭하면 자신의 블로그로 연결됩니다.
  • 깨진 블로그/이미지 주소를 가진 코멘트는 수정/삭제 대상입니다.


  •   Forget me

    ?