DNSBLを使ってCOREBlog2スパム対策強化
スパム撃墜数増加を切に望む
- Category(s)
- Zope&Plone
本BlogにNGキーワードによるコメントSPAM、トラックバックSPAM対策を行って早一年。
コメントスパムのほうはいいとしても、問題はトラックバックスパム。NGキーワードを設定してもまた新たなワードでぽつぽつと入ってきてるのですよ。おまけに「これはNGだ!」って登録したキーワードではその後になると来ない。つまり、NGキーワード登録数がどんどん増えていくだけで効果はあまりないと言うわけで 。・゚・(つД`)・゚・。
そこで、思いついたのが DNSBL 。SPAMメール対策では既に qmail+rblsmtpd を使ってやっているんですけど、同じような感じで blog にも同等な機能を実装してみようと。
んで、いろいろ調べていくと、「クライアントIPを逆にした文字列+DNSBLのDNS名」でDNS問い合わせを行って、返答が返ってきたらそいつはBlackListに登録されている。ということが判明。
早速判定するソースを作って、Ploneへの実装は・・・取りあえず External Method として登録して、NGキーワードスパム対策を施してある tbping と validateComment にうだうだ判定文を追加してみました。(COREBlog2スパム対策(まとめ) のソースを既に入れ込んであると仮定してそれからの追加分を・・・)
◆ $[ZOPEINSTANCE]/Extensions/checkDNSBL.py (External Methodとして登録)
########################################################################
#
# isDNSBLResisterdIP( IP Address )
# True : Black IP
# False : White IP
#
#######################################################################
def isDNSBLRegisteredIP( ipaddr ) :
import socket
import re
debug = 0
# DNSBL List
dnslist = ['niku.2ch.net','all.rbl.jp','bsb.spamlookup.net','sbl-xbl.spamhaus.org','bl.spamcop.net']
# White List (Regex)
wlist = ['192\.168\.*','127\.0\.0\.1']
# check IP Addr String
ipaddr=str(ipaddr)
ipaddr=ipaddr.strip()
p = re.compile('^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$')
if p.match(ipaddr) == None:
if debug : print "Illigal IP Addr"
return False
# Check White List
for w in wlist :
p = re.compile( w )
if p.match( ipaddr ) :
return False
# Inquires DNSBLs
ips = ipaddr.split('.')
rtc = False
for dns in dnslist :
addr = ips[3] + '.' + ips[2] + '.' + ips[1] + '.' + ips[0] + '.' + dns
try :
tmp = socket.gethostbyname( addr )
if debug : print "ip=%s rtn = %s" % (tmp,addr)
rtc = True
break
except socket.gaierror :
continue
else :
return True
return rtc
◆ $[ZMI]/portal_skins/custom/validateComment (太文字のところが変えたとこ)
from Products.CMFPlone import transaction_note
REQUEST=context.REQUEST
client_ip=REQUEST.getClientAddr()
moderated = None
reqs = ['title','body']
#See setting and append required field list
if context.getComment_require_author():
reqs.append('author')
if context.getComment_require_email():
reqs.append('email')
if context.getComment_require_url():
reqs.append('url')
errors = []
for key in reqs:
if REQUEST.has_key(key) and not REQUEST[key]:
state.setError(key, 'Please enter a value', new_status='failure')
errors.append(key)
# check BlackList IP
if context.isDNSBLRegisteredIP( client_ip ) :
state.setError(client_ip, 'Your IP Address was resistered in BLACKLIST.', new_status='failure')
moderated = 'BlackList IP'
if moderated == None :
for key in ['title', 'body', 'author', 'email', 'url']:
if REQUEST.has_key(key):
m = context.validateBuzzWords(REQUEST[key], True)
if not m:
state.setError(key, 'Please remove NG words.', new_status='failure')
moderated = 'NG words'
#Try to send mail for Bad comment
if moderated != None:
context.addCommentMail(
author=REQUEST['author'],email=REQUEST['email'],
url=REQUEST['url'],title=REQUEST['title'],
body=REQUEST['body'], moderated=moderated,
remoteip=client_ip)
if state.getErrors():
if moderated == 'BlackList IP' :
state.set(portal_status_message='The comment addition is refused. Your IP is resistered in the blacklist.')
else :
state.set(portal_status_message='Please correct the errors shown.')
return state
◆ $[ZMI]/portal_skins/custom/tbping (太文字のところが変えたとこ)
from Products.CMFCore.utils import getToolByName
from Products.CMFPlone.utils import log
cbtool = getToolByName(context, 'coreblog2_tool')
REQUEST = context.REQUEST
form = REQUEST.form
RESPONSE = context.REQUEST.RESPONSE
entry = context
excerpt = ''
if form.has_key('excerpt'):
excerpt = form['excerpt']
title = cbtool.convert_charcode(form['title'])
blog_name = cbtool.convert_charcode(form['blog_name'])
excerpt = cbtool.convert_charcode(excerpt)
moderated = True
client_ip = REQUEST.getClientAddr()
#Try to add trackback
try:
# !!!STAART modify by shimizukawa!!!
moderated = True
# check BlackList IP
if context.isDNSBLRegisteredIP( client_ip ) :
moderated = False
for text in [title, blog_name, excerpt]:
m = context.validateBuzzWords(text, True)
if not m:
#state.setError(key, 'Please remove NG words.', new_status='failure')
moderated = False
#Try to send mail for Bad comment
if not moderated:
context.addTrackbackMail(
title=title, url='',
blog_name=blog_name,
excerpt=excerpt,
moderated=moderated,
remoteip=client_ip,
message='NEED MODERATE',)
raise 'NEED MODERATE'
# !!!END modify by shimizukawa!!!
#Send notify mail if need
if context.getSend_trackback_notification():
try:
to_addr = context.getNotify_to()
from_addr = context.getNotify_to()
msgbody = context.translate('trackback_notify_body')
elements = {}
for k in ('blog_name','title','excerpt','url','excerpt'):
if form.has_key(k):
elements[k] = REQUEST.form[k]
else:
elements[k] = ''
elements['post_ip'] = client_ip
elements['entry_url'] = context.absolute_url()
msgbody = msgbody % (elements)
msgsubject = context.translate('trackback_notify_title')
mgsheader = """To: %s
From: %s
Mime-Version: 1.0
Content-Type: text/plain; Charset=utf-8
""" % (to_addr,from_addr)
cbtool.send_mail(mgsheader+msgbody, to_addr, from_addr, msgsubject)
except Exception,e:
log( 'COREBlog2/tbping: '
'Some exception occured, %s' % e )
entry.addTrackback2Entry(title=title,url=form['url'],\
blog_name=blog_name,excerpt=excerpt)
return context.tbping_result(client=context,REQUEST=REQUEST,\
error_code=0,message='Thanks :-)')
except:
if moderated:
return context.tbping_result(client=context,REQUEST=REQUEST,\
error_code=1,message='Error occured!')
else:
return context.tbping_result(client=context,REQUEST=REQUEST,\
error_code=1,message='SPAMMER乙')
一番最後の tbping_result() はちょっとしたオチャメですwwww
これで一応設置は完了。はてさて、どれだけ撃墜数が増えるか(wktk。あと、DNSBLチェックメソッドも Plone Product として作り込みたいですねえ。Plone 上から DNSのリスト とか、ホワイトリスト とか変えたいですし。
参照させていただいたサイト
- COREBlog2スパム対策(まとめ) ※これから大元のNGキーワードによるスパム対策を施してます
- ィワタマ|SiDE-b :: RBL(DNSBL)でコメント・スパムをブロックする
- ぜろちゃんねる(0ch BBS Script)掲示板のスパム対策 : Under Construction, Baby
- Zope Tips ※External Methodの登録の仕方を参照しますた
- The URL to Trackback this entry is:
- http://www.maruz.net/blog/148/tbping