스팸과의 전쟁 -_-!!

우선 게시판 스팸은 회원제로 바꿔버리면 반 이상은 해결할 수 있을거 같으니 제껴두고, procmail 룰 강화로 인해 필터링되지 않아야 할 메일이 필터링 되는 일이 있는지 체크할 겸 해서 로그를 남겨 지켜보는 중인데.. “광고” 라는 문구를 넣으면서도 필터링에서 피하기 위해 노력한 흔적들이 상당히 많이 보인다 -_-!!

  • 제목에 “(광고)” 란 단어를 넣긴 했지만.. base64 로 인코딩해서 보냄
  • 역시 제목에 “(광고)”란 단어를 넣긴 했지만.. quoted print 로 인코딩해서 보냄
  • &#unicode;&#unicode; 식의 방식을 사용.. “(광고)” 를 표현..

그 중 2번째와 세번째 같은 경우는 아예 인코딩된 글자 자체를 필터에 추가시키면 완벽하게 차단이 가능하지만, 문제는 첫번째 방식! base64 인코딩의 경우 7bit 단위로 잘라서.. 테이블을 이용 변환시켜버리기 때문에 “(광고)”라는 글자가 나오는 위치에 따라 결과가 많이 달라지기 때문에.. 필터링 못하는 경우도 생길 듯 하다.. base64 나 qprint 로 인코딩되서 오는 경우엔.. 오히려 어떤 charset 으로 표현된 글자인지를 알 수 있는 장점이 있으므로.. 저렇게 인코딩 해서 보내는게 나쁜건 아니지만.. 뭐 하튼 그렇다는 얘기…

최적의 솔루션이라면 디코딩을 한 후 유니코드로 변환해서 문자열 필터를 통과시키는 방법이겠지만.. 그럴려면 간단한 프로그램을 새로 짜야 하기 때문에, 귀찮은게지 -_-;; 또 제목이 전혀 인코딩되서 오지 않은 경우엔 어떤 언어인지 모르기 때문에 유니코드로 변환하는 도중에 예외 상황이 만들어지는 것도 문제고.. (사실 대강 끼워맞추기로 해결은 가능하지만)

[spoiler ‘simple”그동안의 성과 보기”숨기기’]

unfix skel # cat /var/log/procmail.log |grep ^[Adv|wc -l
429
unfix skel # cat /var/log/procmail.log |grep ^[Fake|wc -l
1561
unfix skel # cat /var/log/procmail.log |grep ^[Spam|wc -l
0
unfix skel # cat /var/log/procmail.log |grep ^[Viagra|wc -l
1
unfix skel # cat /var/log/procmail.log |grep ^[Virus|wc -l
2
unfix skel # cat /var/log/procmail.log |grep ^[Empty|wc -l
27
unfix skel # cat /var/log/procmail.log |grep ^[Bad|wc -l
127
unfix skel # cat /var/log/procmail.log |grep ^From|wc -l
493

[/spoiler]

지금까지의 작은 노력만으로도 결과는 만족스럽다는 사실 :)

Related Posts

Published by

5 thoughts on “스팸과의 전쟁 -_-!!”

  1. base64 인코딩이라고 해도 위치에 따라서 가능한 코드에 제한이 있으니까 적당히 정규표현식을 넣어 주면 가능하지 않을까 싶습니다. -.- (한 번 해 보자;)

  2. 글쎄요.. euc-kr 로 인코딩된 “(광고)” 라는 글자는.. 6바이트를 차지하고.. 48bit 으로 구성되는데.. 7로 나누면.. 6bit 가 남습니다.. 광고 라는 글자만 가지고 필터링을 하려고 해도.. 4바이트니까 32bit 로 구성되고 7로 나누면.. 4bit 가 남으니까..

    앞 뒤로 .. 4개의 bit 가 추가될 수 있다는 얘긴데.. 그렇다면.. 경우의 수가 상당히 많아질 듯 한데요 :) 정규표현식으로 가능하다고 해도 상당히 비효율적일 듯 하네요.. 디코딩하고 유니코드로 변환한 후에.. 필터를 거치는게 역시 젤 적합한 솔루션이 아닐까 싶습니다..

    :0fw 등의 규칙을 사용해서 필터에 넘겨주고.. 그 필터에서 디코딩 -> 유니코드 -> xml entity 를 유니코드로 변환 과정을 거친 다음… 결과물에서 필터링하려는 문자열이 존재한다면, “X-spam-status: spam” 식의 헤더를 붙이도록 하는게 최적일 듯 싶습니다 :)

    (다만 다시 하는 얘기지만 구차니즘이란..)

  3. 메일 본문의 제목을 보면 Subject: =?EUC-KR?b? 이런식으로 나오는데.. 인코딩된 제목이면 =?로 시작하고 그 다음 코드페이지가 나오고 그리고 ??사이에 b 가 나오면 base64로 인코딩된거고 q면 quoted-printable로 인코딩된거니 그에 맞게 제목을 디코딩한후 간단하게 “광고” 필터링해주면 크게 걱정안해도 될것 같습니다.
    (제가 사용하는 것은 qmail 에서 hcode 를 사용합니다.)

  4. 예 저도 그 점은 알고 있습니다 :) 정확하게는 저렇게 되고 끝이 ?= 로 끝났을 경우가 인코딩이 된건데요.. 디코딩을 하지 않는게.. 다국어 환경을 위해서 더 유리한 점이 많습니다.. 다행히도 아직까지는 “(광고) ” 정도가 인코딩되서 오기 때문에.. 거의 필터링해낼 수 있군요..

  5. mmencode와 iconv를 활용하면 디코딩과 문자셋 변환이 해결되지 않을까요…

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">