포럼
간단한 스팸방지 애드온 아이디어 및 배포
2014.05.10 03:37
간단한 스팸방지(회원가입/글쓰기/댓글쓰기 방지) 애드온을 만들어 보았습니다.
애드온의 원리와 스팸차단의 전제 조건은 다음과 같습니다.
- 스팸봇은 javascript를 해석하고, 실행하지 못한다.(즉 DOM을 만들고 해석하지 못한다)
- 스팸봇은 단순히 HTTP 패킷을 만들어서 서버로 보내는것 뿐이다.
- 스팸봇은 CSS를 해석하지 못한다.
따라서 다음과 같이 작동합니다.
1. 페이지 로딩과 함께 페이지에 존재하는 모든 form에 대하여 다음과 같은 input 2개를 모두 동적으로 삽입합니다.
<input type="hidden" value="any_string" name="any_name1"/>
<input type="text" value="" name="any_name2" style="visibility:hidden ; position:absolute"/>
이렇게 되면 폼을 보낼때 위 2개의 값도 같이 포함되어 보내지겠지요.
2. 애드온에서 module이 실행되기 전에 우선적으로 저 위의 2가지 값을 검사합니다.
2-1) any_name1에 정상적으로 값(any_string)이 들어갔나 체크합니다.
(스팸봇은 자바스크립트 실행을 못하기에 아마 저 input 자체가 같이 들어오지 않았을 겁니다. 값이 변조되거나 비어있는채로 왔다면 행동을 차단시킵니다.)
2-2) any_name2에 임의에 값이 삽입되지 않았나 체크합니다.
(스팸봇은 입력할 수 있는 모든 input값(type=text)을 채우려 할것입니다. 위의 경우에서도 any_name2에도 어떠한 값을 채우려 하겠지요. 그러나 any_name2는 CSS 때문에 보이지 않기에 정상적인 사용자라면 입력을 하지 못하고 그냥 폼을 보내야겠지요. 한편 스팸봇은 CSS를 해석하지 못하기에, any_name2에도 임의의 값을 채울것이고, 만약 임의의 값이 들어가 있다면(비어있지 않다면) 글쓰기를 차단시킵니다.)
이 애드온의 장점은 다음과 같습니다.
1. Javascript만 작동하면 이론적으로는 사용자의 불편없이 추가적인 스팸필터링이 가능합니다.
이 애드온의 경우 단점/문제점이 몇개 있습니다
1. 비 Javascript 환경에서는 글쓰기/회원가입/댓글 작성 자체가 불가
폼을 동적으로 삽입하고, 이것을 체크하여 스팸봇을 걸러내는데, 비 Javascript 환경을 스팸봇으로 인식합니다. 그래서 해당 환경에서는 글쓰기/회원가입/댓글 쓰기 자체가 불가능합니다. 그런데 뭐 이건 캡차도 마찬가지인 문제이지요.
2. 사용하시는 게시판에 따라서 글쓰기/댓글쓰기가 차단 여부가 조금 복잡합니다.
회원가입은 확실히 애드온이 적용이 되는데, 사용하시는 게시판 스킨에 따라서, 글쓰기, 댓글쓰기 스팸차단은 애매하게 됩니다. 정확히 설명하면, jQuery를 통한 동적 input form 삽입이 안되는 경우가 있는것 같습니다.
현재까지 확인된것은 다음과 같습니다.
- XE모바일 기본 게시판 스킨에서는 댓글, 게시글이 모두 정상적으로 스팸차단이 가능합니다.
- 스케치북 게시판(RC15) 기준, PC에서 비정상적인 글을 쓰는것은 정상적으로 차단이 되나, 댓글은 차단이 되지 않습니다. (댓글에서는 동적으로 form 생성 자체가 되지 않습니다. 자바스크립트가 꼬여서 그런듯 합니다.)
(이 경우 댓글은 스팸필터 적용을 하지 않고, 글만 스팸필터 적용이 가능하도록 바꾸는것이 소스를 수정하셔야 합니다. 그렇지 않으면, 댓글 작성 자체가 차단됩니다.)
라이센스는 LGPLv2이며 자료실에 올리기에는 완성도가 많이 떨어지고 하여, 여기에 간단히 올려봅니다.
현재로서는 사이트별로 디버깅 하시면서 사용하셔야 할것 같습니다.
차후에 애드온이 안정화되고, 스케치북게시판도 안정화 되면 정식으로 자료실에 업로드 해보겠습니다.
- [2014/08/19] 묻고답하기 해킹인가요 왜 자꾸 회원가입수가 늘어나요. *2
- [2014/06/25] 묻고답하기 회원가입시 "스팸입니다" *3
- [2014/06/06] 묻고답하기 제로보드 해외 해킹 문제 *3
- [2014/05/31] 포럼 XE 외국 호스팅 설치시 스팸 도배 엄청나네요 *13
- [2014/05/26] 묻고답하기 외국 스팸....어떻게 처리하시나요? *11
댓글 14
-
GG
2014.05.10 04:34
-
Paul
2014.05.10 05:18
- 스팸봇은 javascript를 해석하고, 실행하지 못한다.(즉 DOM을 만들고 해석하지 못한다)
- 스팸봇은 단순히 HTTP 패킷을 만들어서 서버로 보내는것 뿐이다.
- 스팸봇은 CSS를 해석하지 못한다.
역시~ 적을 알아야 막을 수 있는것 같습니다! 좋은 애드온 감사합니다! ^^ -
LI-NA
2014.05.10 09:34
하지만 XE는 유명 솔루션으로, XE 전용 봇이 따로 있는걸로 알고 있습니다.
딱 필요한 부분만 싹 채워서 보내는 그런 봇 말이죠...ㅠㅠ
여튼, 저런 방식을 사용하면 사용자별로 value값을 다르게 하는것만으로도 스팸 차단 효과가 있겠네요.
훌룡한 애드온입니다.
-
키스투엑스이
2014.05.10 09:37
XE 전용 봇이 있나요? 후덜덜... -
LI-NA
2014.05.10 09:37
자동 가입 및 가능한 게시판을 찾아서 올리는게 있는 것 같더군요...
-
키스투엑스이
2014.05.10 09:37
무섭네요. -
퍼니엑스이
2014.05.10 09:52
자동 등록 프로그램을 만드시는 분들께는 ~ 한 방법으로 막을 것이라고 미리 알려주는 꼴이 되므로, 만드신다면 조용히 만드시는 게 좋습니다 ㅠ.ㅠ
-
銀童
2014.05.10 11:51
이 방법도 의미가 없습니다. 이게 설치되있는걸 확인해서 인식하면 그만이니깐요
개인사이트별로 이걸 변형해서 적용한다면 모를까요.
-
AJKJ
2014.05.10 13:36
말씀해 주신대로 사실 이 방법도 완벽하지 않지요. 다만 기본적인 쌩 http packet 을 날리는 봇 정도는 막아보자 라는 차원의 아이디어이고, 일단 애드온에 최적화 된 봇을 만들지 않을 꺼라는 생각이 들어서 이렇게 방어하고자 해요. 각종 변수와 애드온 이름 변경같은 간단한 변형 + 세션에 random string을 저장하고 hidden input에 해당값을 삽입하고 서버에서 검증 하는 방법 같이 변형하면 어느정도는 스팸에 방어가 되지 않을까 생각 하고 있어요. -
콩까기
2014.05.10 19:19
감사드립니다^^
-
ibin
2014.05.10 22:57
JavaScript 실행이 안되는 환경에서 글을 작성할 경우, 스팸으로 처리하는 방법은 투자시간대비 효과가 좋습니다.
저도 http://best79.com/xe/free 에서 영문스팸이 하루에 수십~수백개씩 올라와서 7개월간 적용해봤는데,
정상 글이 잘못 차단된 경우는 아직 한건도 없었습니다.
그러나 가끔 JavaScript 실행 가능한 스팸 등록기를 사용하거나, 알바가 직접 올리는 스팸은 어쩔 수 없더군요. 그냥 글 등록 알림 메일을 받아 수시로 지워주고 있습니다... :)
덧붙임) 대형 사이트에는 이 방법이 소용없습니다. 대형 사이트는 거기에 맞게 항상 스팸 등록기가 갱신되고 있을테니...
-
prologos
2014.05.12 23:35
저도 비슷한 자료 만들어서 사용하고 있어서 문의하나 드리겠습니다. 자료실에 정식 등록하진 애드온을 살펴보니 input name에 대문자를 사용하셨던데 Context::get()이 잘 작동하나요? 제 경우는 name에 대문자가 들어가면 value값을 못가져 오는 현상이 있어서 소문자+숫자 조합으로 사용한 기억이 있어서요 @.@
그리고 저는 정규식 사용해서 form추가 했는데 댓글관련 form에도 정상 작동하는거 같습니다.
form의 id값에 "insert"가 포함되거나 onsubmit값에 "insert"가 포함되어 있으면 필요한 input을 추가하도록...
$honeypot_input = '<input type="hidden" name="name1" value="value1"><input type="text" name="name2" style="visibility:hidden; position:absolute;">'; preg_match_all("!<\s*form[^>]+(id\s*=\s*[^>]+insert|onsubmit\s*=\s*[^>]+insert)[^>]+>([\s\S]*?)<\s*/\s*form\s*>!", $output, $matches); foreach($matches[2] as $val) { $output = str_replace($val, $honeypot_input.$val, $output); }
-
AJKJ
2014.05.13 01:52
저는 애드온을 만들면서 대소문자 구분을 고려하지 않고 그냥 만들었는데 문제 없이 정상적으로 작동하고 있는듯 네요. 참고로 저는 XE 1.7.3.8 을 사용중이에요.
아 그리고 사실 저도 regular expression을 이용하는 방법도 생각하고 있긴 했었어요. 그러나 아직 제가 regular expression에는 왕초보라서 아직 시도하지는 못하였네요.ㅠㅠ 올려주신 코드도 바로바로 해석이 안되고 php.net을 보면서 겨우 해석하는 수준이네요. 차후에는 저도 regular expression을 사용하고, 폼이 전송되는 순간(onsubmit)에 동적으로 폼을 삽입하는 방법을 사용하고자 생각중이에요. 그러면 댓글과 글에대한 스팸봇 방지도 해결이 될것 같아요.
그리고 <form>의 method가 get이 아닌 post인 경우에만 input form을 추가해야 하지 않을까 생각이 들어요. 그 이유는, 검색같이 get을 이용하여 보낼경우에 불필요한 봇 검증 data를 보냄으로 인해서 url이 짤리지 않을까 약간 생각이 들었어요.
-
prologos
2014.05.13 10:35
저도 정규식은 도움말 열어놓고 작성합니다 ㅠㅠ
http://msdn.microsoft.com/ko-kr/library/ae5bf541(v=vs.90).aspx
업데이트 기대하겠습니다 ^^
스팸봇이 패킷을 만들어서 서버로 보내는 건가요?
스팸등록하는 과정이나 툴을 한번 봤으면 좋겠네요...