'스팸 필터링'에 해당되는 글 1건

  1. 2008/11/13 귀천 스팸에 대한 고찰

우리 학회 홈페이지에 인증 없이 글을 쓸 수 있는 게시판이 있는데,

여기에 스팸글이 엄청나게 올라온 일이 있었다.


spam
출처 : www.spamdeputy.com 개 놀랬다... 열받는다고 개를 쏠 수는 없는일...

그 글들은 spam bot 이 올리는 경우가 대부분이고
한번에 같은글이 3~4개씩 올라 오곤 했다. (이런 나쁜시키들...... -_-)

기존 우리 홈페이지에서 스팸 필터링 하는 방법은, 관리자가 스팸글에 대해
스팸 등록을 하면, 그 글을 등록한 IP 주소의 접근을 차단하는 방식 이었다.

그런데 ... 역시나 우리의 스팸봇은 IP 주소를 신나게 바꾸면서 달려 들었다.

게으른 서버 관리자 귀천 은... 스팸이 올라오면 확인하면서 스팸 처리하는게
더 귀찮아 지자 조금 생각을 해 보았다.

그런데..........................

코드 몇줄이면 스팸 처리를 무난하게 할 수 있다는걸 깨달았다.

=> 대부분의 스팸들은 공통적인 keyword 를 가지고 있기 때문에 그 keyword 가
들어오면 글 올리는것을 방지 하는 것 이다. 게다가 본문도 아니고, 그냥 제목에 대해서만
스캐닝 한다고 할지라도 스팸 차단률은 생각보다 매우 뛰어나다.

지금 스팸 키워드는 약 100개쯤 등록해 뒀는데,
정말 가끔 스팸이 올라오면, 확인해 보고 스팸 키워드 몇개 등록하면 된다. 후훗...

그래서 quick & dirty 코드를 몇줄 작성했다.

// MAYA : Spam filtering code.
# 스팸 차단용 키워드 파일 "," 로 구분해서 저장해 둔다.
define(X_WORD_FILE, "/home/path/xwords");

function fget_xword_list($file_name) {
  $words_file = fopen($file_name, "r");
  $xwords = "";
  while( !feof($words_file) ) {
      $buf = fgetc($words_file);
      if ( ctype_space($buf) ) # skip whitespace
            continue;
      $xwords .= $buf;
    }
  return explode(",", $xwords);
}

function __is_valid_title($title, $word_list) {
    foreach($word_list as $word) {
    # mb_stripos : multibyte case insensitive function
    # return "boolean" if doens't contains, but "integer" if contains
        if ( gettype(mb_stripos($title, $word)) == "integer" )
        return false;
    }
    return true;
}

function is_valid_title($title) {
    return __is_valid_title($title, fget_xword_list(X_WORD_FILE));
}





뭐 이래서 is_valid_title(“여기에 스캐닝 할 문자열들, 제목이던 본문이던 알아서...”) 해서

boolean 값 가지고 스팸 인지 아닌지 판단하면 된다.

좀 이상한건 gettype(mb_stripos($title, $word)) == “integer” 인데 mb_stripos 함수는 리턴값이
참.......... 제멋대로라 저런 식으로 코드를 썼다. $word 가 $title 에 존재하지 않으면 false 를
존재하면 그 존재하는 위치의 offset 값을 integer 로 리턴한다.

뭐 암튼..... 결론적으로 매우 경제적이고(?) 쓸만하다.

2008/11/13 21:25 2008/11/13 21:25
받은 트랙백이 없고, 댓글이 없습니다.

댓글+트랙백 RSS :: http://maya.jaram.org/blog/bth/rss/response/8

댓글+트랙백 ATOM :: http://maya.jaram.org/blog/bth/atom/response/8