« BigTemplateWindow | Main | alogblog MT 인터페이스 플러그인 »

스팸 코멘트, 트랙백을 막기 위한 CCode 와 TCode 플러그인

Go to English page

Current Version: 3.2.03

이 플러그인은 각종 피드백(코멘트, 트랙백) 스팸을 방지하기 위한 것입니다. 코멘트의 경우에는 숨겨진 입력 필드를 추가하고, 트랙백은 원 트랙백 ID뒤에 추가로 코드를 추가한 후에, 이 추가된 값을 자바 스크립트로 된 obfuscator(흐트리기 ?)를 이용해, 쉽게 추측할 수 없도록 함으로서 스팸을 방지하는 방식입니다.

무버블 타입 3.2 버전부터 스팸 필터링 기능이 강화되었습니다. 예전의 Blacklist같은 역할을 엠티 자체 기능 + 디폴트로 제공된 플러그인을 이용해, 스팸을 거르는 시스템으로 자리 잡았습니다만, 이 기능들은 모두 후처리 기능이라 할 수 있습니다. 즉, 일단 스팸이 엠티 시스템에 도착한 후에, 내용 필터나 URL 필터등을 통해 스팸점수를 부가하고, 이 값에 의해 스팸처리를 하는 방식입니다. 이런 방식은 일단 모든 스팸 피드백을 엠티 시스템내의 데이터베이스에 기록한다는 취약점을 내포합니다. 물론 3.2 부터는 스팸을 일괄 삭제하기도 편해졌고, Modulation을 이용하면 피드백이 퍼블리싱되지 않고 엠티 내부적으로만 보관되게 해서, 불필요하게 개별 엔트리등이 지저분해지거나 퍼블리싱하는데 시스템 자원을 낭비하지 않는 장점은 있지만, 어쨋든 디비에 저장된 다수의 스팸을 블로거 입장에서 필터링/정크처리/unpublishing/삭제 등을 해야만 하는데, 이에도 분명 블로거의 노력과 시스템자원의 소용이라는 작용이 개입되어야만 하는 단점은 분명 있습니다.

CCode와 TCode는 전처리에 집중하는 방식입니다. 즉 기존의 스팸봇이 코멘트 폼의 주소와 정형화된 입력필드값을 이용해, 주소를 예측,반복 생산하는 방식으로 다수의 스팸피드백을 프로그램에 의해 전송하는데, 이 플러그인을 설치하면, 코멘트/트랙백 주소의 단순 예측/반복생산으로는 거의 맞추기 불가능하므로 그런 스팸들을 아예 처음부터 엠티 시스템 내에 받아들이지 않는 방식으로 작동하게 됩니다. 또한 그 방식이 독립적이기때문에, 엠티의 후처리 스팸처리 방식과 양립가능하며, 다른 방식의 스팸처리 플러그인과도 무리없이 중첩적으로 작동할수 있습니다.

이 플러그인은 PHP 버전도 제공하므로, 동적 파일생성(Dynamic publishing)을 이요하는 경우에도 사용가능합니다.

Requirement

MT 3.2
동적파일생성(Dynamic publishing)을 이용한다면, mySQL 과 같은 데이터베이스 사용.

Installation

압축파일을 다운받아 (mt home) 폴더 바로 밑에서 $ tar xvfz CTCode-3.2.03.tar.gz 등과 같은 방법으로 풀면, 아래와 같은 폴더 구조아래에 파일들이 자동 생성됩니다. 만약 telnet 등과 같은 터미널 환경을 사용할 수 없는 경우에는 ftp 등으로 아래 폴더 구조대로 개개의 파일들을 업로드하면 됩니다.

  • (mt home)/default_templates/obfuscator.js
  • (mt home)/php/plugins/alogblogObfuscator.php
  • (mt home)/php/plugins/init.alogblog-CCode.php
  • (mt home)/php/plugins/init.alogblog-TCode.php
  • (mt home)/plugins/BigPAPI.pl
  • (mt home)/plugins/alogblog/CCode.pl
  • (mt home)/plugins/alogblog/TCode.pl
  • (mt home)/plugins/alogblog/lib/alogblogObfuscator.pm

설치한 (mt home)/default_templates/obfuscator.js 파일의 내용을, (mt_home)/default_templates/site_javascript.tmpl 템플릿 파일을 열고 그 맨 뒤에 고스란히 모두 복사해 붙인 후, 저장합니다. 그리고 엠티의 템플릿 목록 페이지로 가서, Site JavaScript 템플릿을 체크표시한 후에, 오른쪽 위에 있는 Refresh Template(s) 라는 액션 명령을 실행(Go)합니다. 그러면 바로 전에 추가한 내용이 현재 블로그의 Site Javascript 템플릿에 반영되면서 업데이트가 됩니다. 향후 새 블로그를 생성하는 경우에는, 이와 같은 액션 명령이 없어도, 업데이트한 site_javascript.tmpl 템플릿 내용대로 생기게 됩니다.

Tag Usages


1. CCode

CCode는 코멘트 스팸 방지를 위해 기존의 입력폼에 대한 필드값에 숨은 속성의 값을 하나 더 추가해 주는 방식으로 스팸봇을 따돌리는 형태입니다. 따라서 기존의 코멘트 입력관련 템플릿 부분에 새로운 코드를 삽입하는 태그를 삽입해줘야 합니다.

Individual Entry Archive 템플릿과 Coment Preview 템플릿의 코멘트 <form> 태그 내에 <$MTEntryCCode$>를 다음과 같은 위치에 삽입, 저장한 후 정적파일생성 이용시라면 리빌딩을 해주면 됩니다.

<input type="hidden" name="entry_id" value="<$MTEntryID$>" />
<$MTEntryCCode$>

* 이렇게 직접 현재 블로그의 템플릿에 바로 추가 수정해주는 방식은, 향후 새 블로그를 생성하는 경우에 다시 이 추가 과정을 그 블로그의 템플릿에 해줘야 하는 불편이 있습니다. 따라서 이 경우에도 위의 설치과정에서 행한 방식처럼, (mt home)/default_templates/individual_entry_archive.tmpl, comment_preview_template.tmpl 파일 상에서 직접 위처럼 MTEntryCCode 를 삽입, 저장한 후, 마찬가지로 Refresh template(s) 액션으로 반영해주는 방식이 편리할 수 있습니다. 이 후 새로 생성하는 블로그의 템플릿에는 위 추가 코드값이 반영되어 있게 됩니다. ( Updated with help of Jeb )

2. TCode

TCode는 기존 엠티의 <MTEntryTrackbackID>, <MTEntryTrackbackLink>, <MTEntryTrackbackData> 태그를 모두 그대로 이용합니다. 즉 새로 템플릿을 수정할 필요는 없고, 그냥 새로 리빌딩해주면 됩니다. (물론 동적파일생성 이용시에는 이조차 필요없습니다)


* MTEntryTrackbackID / MTEntryTrackbackLink 태그에 추가된 속성

  • <MTEntryTrackbackLink nocode="1"$> : 만약 XML 피드파일 등에 트랙백주소를 삽입하고자 할 경우에, obfuscated된 자바스크립트 주소를 넣을 수 없으므로 modulation 처리되는 주소 형태로 주소를 출력하는 속성을 이용해 다음과 같은 형태로 주소를 표시하는 것입니다. ex) ".../mt-tb.cgi/24.your ping is to be moderated, so please dont't send repeatedly"
  • <MTEntryTrackbackLink nocode="2"$> : ex) ".../mt-tb.cgi/24"
  • <MTEntryTrackbackLink hidden="1"$> :이 "hidden" 속성은 실제 아이디/주소값을 화면에 출력하는 대신에 각각 __MTTBID__, __MTTBLINK__ 라는 이름의 javascript 변수에 값을 대입만 해줍니다. 만약 주소를 클립보드에 복사해주는 기능등을 구현하고자 한다면, 그 최종 주소값을 자바스크립트 내에서 사용할수 있기 위해 이 속성을 사용하면 됩니다. copytoclipboard(__MTTBLINK__); 와 같은 형태로 나타날 것입니다.

Description


* 아래 내용은 스팸봇의 작동방식이나 이 플러그인의 작동원리에 대한 일종의 개인적인 로깅의 성격이 매우 강합니다. 당장의 설치/사용엔 !!!전혀!!! 필요없는 내용입니다. 몰라도 지장이 없습니다. 초보자들은 모르는게 오히려 더 상쾌한 블로깅을 보장할 수도 있습니다.


1. CCode

CCode는 앞서 설명대로 기본 코멘트 입력 form의 입력필드에 추가로 새로운 필드를 더하게 되니다. 이 추가된 값(CCode)은 엔트리 자체의 데이터를 이용해 플러그인 내에서 계산되어 집니다. 그리고 이 코드값은 자바 스크립트에 의해 흐트려(obfuscated)집니다. 이때 사용된 obfuscator는 http://www.jottings.com/obfuscator/ 를 이용했습니다. 원래 이 "흐트리기"는 이메일 주소를 스팸봇에게 노출되는것을 방지하기 위한 것인데 이를 응용한 것입니다.

이제 스팸봇이 임의의 엔트리에 대한 코멘트에 스팸을 전송하기 위해선, 이 여분의 CCode값을 알아야만 합니다. 물론 이론적으로는 역계산 방법에 의해 이 값을 알아내는게 불가능하진 않을겁니다만, 문제는 설사 그 방법을 알아 냈다손 치더라도, 그 루틴에 의해 사용할 수 있는 CCode는 그 페이지에만 해당한다는 것입니다. 따라서 100군데 엔트리에 보내기 위해선 100번 다 계산해 내야하는데, 한번 계산시마다 페이지 파싱(요게 매우 비싼 과정입니다), 값 계산, 전송의 단계를 거쳐야만 가능하게 됩니다. 현실적으로 스패머가 해커가 아닌 이상, 임의의 블로그에 스팸 코멘트를 전송하기 위해, 이런 비싼 자원(시간+CPU)을 낭비하면서 시도하진 않으리라는 계산이 깔려있습니다. 그들이 하나의 시스템만을 무한한 시간과 자원을 총동원해서 한번만 뚫으면 되는 해커라면 이 정도의 루티은 "껌"에 불과하지만, 제한된 시간내에 불특정 블로그에 가능한 많은 스팸을 보내야만 "돈을 버는" 스패머의 입장에선, 이 CCode 방식을 채택하지 않은 다른 순진한(혹은 멍청한) 블로그가 충분히 존재하는 동안은 그리로만 스팸을 보낼 것이라는 겁니다. (그들이 이 방법의 해결 루틴에 집중하는 시기는, 아마도 멍청한 블로그가 적어짐으로해서, 그들의 수입이

CCode는 사실 그 이름을 SCode(Security Code)에서 따온 것입니다. SCode와 유사한 점은, 기존의 코멘트 입력 필드 외에 추가로 입력 필드가 더 존재하게 되고, 이 추가필드값이 맞아야만 코멘트 등록이 가능하다는 점입니다. 하지만 극명하게 구분되는 차이점은, 그 추가 입력필드 값의 적용에 코멘터의 어떠한 interaction도 요하지 않는 다는 점입니다. 또한 추가 입력필드값의 적용을 위해 시스템 내에 어떠한 DB나 파일등에 값을 저장하지 않는다는 점입니다. 개인적인 견해로는, 자신의 블로그 시스템의 스팸방지를 위해, 제3자인 코멘터의 작용(협조)를 요구한다는 것은, 포털 사이트 등의 회원가입과 같은 1회적 단계에서의 적용이라면 이해가 가능하나, 빈번히 일어나는 코멘트 등록 단계에선 좀 무리가 아닌가...합니다.(물론 CCode를 만든 당사자로서 갖는 아전인수격 견해라고 볼 수도 있습니다.)

2. TCode

제가 생각할 때는, 트랙백 시스템이 갖는 그 개방성과 트랙백 주소 체계의 제한성이 트랙백 스팸 기승의 원인이라 봅니다. 코멘팅 시스템의 경우, 어떤 표준에 근거한 방식이 아니기에, 블로거의 노력으로 추가 입력필드를 더하거나 하는 방식으로 얼마든지 커스터마이징을 할 수 있는 반면, 트랙백 시스템은 정해진 스펙에 맞게 작동하도록 짜여진 프로토콜의 교환입니다. 즉, 주소만 정확하다면 그 누구라도 아무런 제재없이 전송이 가능한 열린 시스템이라는 점입니다.

또하나는 그 트랙백 주소라는 것이, 기본 트랙백주소(Base trackback URL) + 트랙백 ID 와 같은 지극히 단순한 방식으로 거의 모든 블로그 시스템이 운영되고 있다는 것입니다. 물론 스펙상으로 이 트랙백ID자체에 아무런 제한이 없음에도 대부분의 블로그 시스템은 그 프로그래밍의 편리상, 이 값으로 특정값으로부터(보통 1) 증가하는 몇자리의 숫자로 표시하는 실정입니다. 그 이유는 매 엔트리마다 고유한 값을 순차적/독립적으로 붙이기 쉽기 때문입니다.

누구나 주소만 알면 전송할 수 있는 시스템인데, 그 알기만 하면 된다는 주소가 어떤 정형화된 룰에 의해 순차적/반복적으로 유추/생산가능하다면?

이 TCode는 CCode와 정확히 같은 메카니즘으로 개별 엔트리 고유의 데이터를 이용해 TCode라는 값을 계산하고 이 값을 기존의 트랙백 ID뒤에 붙인 값 전체를 하나의 ID로 인식하는 방법입니다.

트랙백 스팸봇의 작업 과정을 한번 재미삼아 알아보면,


  1. 먼저 블로그 메타사이트에 접근합니다.

  2. 거기서 최근에 새로 업데이트된 블로그의 페이지 주소를 뽑아 냅니다.

  3. 그 페이지를 다운 받습니다. (그런데 대부분의 블로그 엔트리 페이지에는 소위 메타 정보가 가득히 삽입되어 있습니다. 그 중에 트랙백 정보가 RDF형식으로 고스란히 들어가 있습니다. 어떤 페이지에서 특정한 값을 파싱을 통해 알아낼 때 가장 어려운 점이, 그 규칙이 일정치 않을 때인데, RDF 트랙백 정보는 애초에 쉽게 그 값을 알아내도록 하기 위해 삽입한 것이라, 간단한 모듈을 사용해 쉽게 그 페이지의 트랙백 주소를 알아 낼 수가 있게 됩니다. 보통은 QuickPost, Bookmarklet, Trackback Auto-Discovery 등과 같이 블로거들이 쉽게 트랙백 정보를 알 수 있도록 하는 목적으로 준비된 메타 태그이지만, 실제로는 이 메타정보의 가장 귀한 손님이 다름아닌 트랙백주소 수집 스팸봇이라는 것입니다.)

  4. RDF 메타데이터를 추출하는 모듈을 이용해 간단히 트랙백 주소를 알아 냅니다.

  5. 이렇게 알아낸 하나의 주소가 가령 www.example.com/tb.cgi/1234 라고 한다면, 맨 뒤의 숫자가 ID라고 인식한 후에, 최소 하나의 사실은 경험상 확실하다고 가정하게 됩니다. 바로 1~1234까지 ID만 바꿔서 주소를 생산해내면, 최소 1개 이상의 주소가 실재하는 주소일 가능성이 크다는 사실입니다.

  6. 1~1234까지 ID를 바꿔가며, 트랙백 주소를 생성하고 각각에 트랙백을 보냅니다. 없는 ID라는 에러 XML이 아니라면 그 ID가 실재하는 주소이므로, 그곳에 집중적으로 더 보낼 수도 있습니다.


TCode에 의해 생산된 주소는 일단 매우 깁니다. 그래서 이런 루핑에 의한 단무지틱한 추측으로는 맞출 수 없습니다. 또한 그 주소가 이미 obfuscator에 의해 가려져있기에, 그 또한 어떤 식으로든 계산해 내야만 됩니다. 기존의 스팸봇의 경우 어떤 댓가를 치루던 하나의 주소만 알아내면, 루핑에 의해 다수의 주소를 추측할 수 있었지만, 이 방식의 경우 설사 하나를 알아 냈더라도 그 값을 기준으로 루핑을 해서 다른 값을 계산할 순 절대 없다는 점입니다.


TCode 에 대한 추가 사항

1. RDF 메타정보의 trackback::ping 필드

앞서 설명한 대로 모든 페이지에는 기본적으로 트랙백 정보가 RDF태그 형식으로 삽입되어 있습니다. 이 페이지의 소스를 한번 보시면 확인할 수 있습니다. 이 메타정보는 편리한 블로깅을 위해 의도적으로 삽입한 것인데, 트랙백주소 자동탐색기능, 각종 북마클릿 기능 등에서 이 정보를 이용해 트랙백 주소를 알아내는 것입니다. 여기서 문제점이 좀 생깁니다. 이 값은 RDF 스펙에 의한 raw텍스트 데이터에 의해 그 값을 표시해야만 합니다. 즉 자바 스트립트에 의해 그 주소값을 obfuscate시켜 삽입할수가 없다는 것입니다. 그래서 이전 3.17 버전의 TCode는 이 메타정보를 삽입하는 템플릿 태그 <MTEntryTrackbackData>가 아무런 값도 반환하지 않게 편법을 사용했습니다. 즉 TCode를 설치하면, 개별 엔트리에 트랙백 메타 정보가 삽입되지 않게 됩니다. 그런데 3.2 에서부턴 트랙백에 대해 Modulation 기능을 통해, 받은 트랙백을 퍼블리싱하지 않고 단지 디비에 저장만 할 수 있는 기능이 있기에, 이를 이용해서 메타 태그값을 처리하게 되었습니다.

바로, 이 페이지의 메타 트랙백 정보를 보면 trackback::ping 필드의 값이 "http://www.example.com/mt-tb.cgi/777.your ping is to be moderated, so please dont't send repeatedly" 와 같이 뒤에 긴 문장이 붙어 있게 됩니다.

만약 QuickPost나 Bookmarklet같은 블로깅툴을 사용하는 분은 이 페이지 상에서 실행해보면, 위 주소가 그대로 나타날 것입니다. 즉 모든 자동화 방법(스팸봇 포함)에 의해 위 주소로 보내온 트랙백은, 엠티 시스템 상에서 Trackback Modulation 기능을 사용하든 안하든, 항상 Pending 상태로 그 트랙백을 퍼블리싱하지 않고, 보관만 해두게 됩니다.

2. 받는 카테고리 트랙백

많은 분들이 잘 모르고, 잘 사용하지 않지만, 개별 엔트리가 독립적으로 트랙백을 받는 것처럼, 카테고리도 독립적으로 트랙백을 받을 수 있습니다. 이 경우에도 똑같이 TCode는 작동하고 passphrase설정도 여전히 문제없이 작용합니다. ( 잘 모르시는 분은 그냥 넘어 가십시요.)

Credits

Thanks, Tim Williams and Andrew Moulden for obfuscator. It initiated me in making CCode/TCCode plugins.

Thanks, Kevin Shay. With his BigPAPI, TCode of category trackback could be dramatically easily programmed.

License

Relased under the Creative Commons License.

Version History

  • 3.2.03 : Missing <$MTCategoryTrackbackLink$> tag added. Thanks id.tiiop for notifying me
  • 3.2.02 : nocode="1", "2" attributes are added in ID/Link. Thanks dusl for this option.
  • 3.2.01 : for MT 3.2, PHP plugin added.
  • 1.0 : for MT3.17

TrackBack

TrackBack URL: http://alogblog.com/movabletype/korean_plugins/TCode.name/39.

QuickPost/Bookmarklet 등과 같은 자동화 도구로 트랙백을 보내시면, 귀하의 트랙백은 이 사이트의 운영자가 승인할 때까지 이 페이지에 표시되지 않습니다. 혹 자동화 방법으로 보내실 경우, 트랙백이 표시되지 않아도, 반복적으로 보내진 말아 주십시요. 감사합니다.

 

Listed below are links to weblogs that reference 스팸 코멘트, 트랙백을 막기 위한 CCode 와 TCode 플러그인:

» Movable Type 3.2 업그레이드 from 지옥만세 bouquins
힘들게 업그레이드를 끝냈다. 기존에 사용하던 모든 플러그인에 대해서 체크를 끝냈고, 3.2한글화 작업, 스팸코멘트/트랙백 방지는 MT 3.2 한글 플러그인 에서 대부분 해결할 수 있다. 역시나... [Read More]

» 코멘트, 트랙백 스팸은 거의 완전히 해결된 듯 from Bomber0@NeT
alogblog에서 받은 CCode 와 TCode 플러그인을 설치했더니, 스팸이 이제 거의 완전히 사라진 듯 하다. MT용 플러그인은 전부 외제만 있는 줄 알았더니 그게 아니었나보다. 몇 년동안 방치해 두었던... [Read More]

» 스팸 댓글 from 블로그 핼미 울타리 - Blog in the Fence -
YES!!! 무버블타입(Movable Type)의 가장 큰 문제점인 스팸 댓글 문제를 매번 고쳐야지 고쳐야지 생각만 하다가 드디어 고쳤다. 아유 귀찮아 죽는줄 알았네. 한국인으로서 무버블타입 플러그인을 ... [Read More]

Comments

RSS 에 트랙벡 주소도 같이 포함시켜서 피딩 하고 싶은데요. 어떻게 방법이 없을까요?

그런 경우가 있을수 있겠네요... 그것도 결국엔 매 엔트리에 삽입되는 RDF 트랙백 메타 데이터이서 하듯이 직접적인 전체주소 가림 효과를 위해 "...mt-tb.cgi/777.your ping is to be moderated, so please dont't send repeatedly" 와 같은 형태로 찍어줘야할텐데, 생각해보니 이렇게 표현할 방법이 현 버전으론 없군요. 조만간(?) 그 기능을 넣어서 업하도록 하겠습니다. 감사합니다.

javascript를 사용해야만 정상적인 경로를 얻을 수 있다는 것이 가장 걸리네요. 코멘트 작성이나 트랙백 핑이 핵심기능이 아니라고 생각하면, 그리고 실제적으로 javascript사용에 문제를 겪는 사람이 극소수라는 것을 생각하면 크게 문제되지는 않겠지만요. :)

아..그리고 저는 MT사용자는 아닌데 다행히 TypeKey인증은 예전에 한번 만든 적이 있었네요...:) 많이 배워 갑니다.

Preview한 다음에는 코멘트 작성이 안되고(해당 글이 없다고 하네요), Camino 1.0을 사용하고 있는데 글 작성 후 404Error가 나오네요. 한글 URL관련 문제인 듯 싶습니다.

지적 감사합니다. Preview에서 안되는건 수정했습니다.
Camino, Firefox, Opera 에선 제대로 한글 주소로 Redirection이 안되고 있습니다.
IE와 Mozilla는 됩니다. Firefox도 예전 버전에서는 됐는데, 업되면서 왔다갔다 합니다.
한글주소가 URI에는 어긋나지만, 요즘 대부분의 브라우저들이 점차적으로 IRI 지원에 나서고 있기 때문에 이런 버그(?)도 수정될꺼라 믿습니다.
이미 Firefox나 Opera등에서 관련한 버그리포팅이 있었던것 같은데,..언제 보완될지는 모르겠습니다. 제가 보기엔 고쳐져야 합당한거라고 봅니다.

Post a comment

☞ Your blog URL:

(TypeKeyOpenID 같은 인증 방식을 통한 코멘트만 입력 가능합니다. 이는 이 블로그가 무버블 타입 전용 플러그인에 관한 것이라, 최소 TypeKey 인증은 가지고 계실 것이라는 가정하에, 시범삼아 인증 코멘터만 받는 방식으로 운영해보고자 함입니다. 불편을 드려 죄송합니다.)