Personal tools
You are here: Home maruz.net blog DNSBLを使ってCOREBlog2スパム対策強化
« April 2024 »
Su Mo Tu We Th Fr Sa
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        
About this blog
戸塚鯖改めとある山中にある鯖からお届けするどーでもいいよーなBlog
Recent comments
Re:エヴォ直った dragon77 slot 2023-11-26
Re:Linuxコマンドメモとか(find、mv) truffe fraiche achat 2023-03-30
Re:エヴォ直った pragmaticplay 2023-01-06
Re:エヴォ直った ceri 138 2022-11-27
Re:模様替え cctv drain survey woking 2022-08-11
Recent trackbacks
ECS 4.0 に対応した ATAmazon takalog 2008-04-15
北海道の積丹は、これから夏がシーズン旨いもの食べること出来ます 特にうにが一番です 北海道札幌から始まり全道の観光地、観光名所、市町村の情報紹介 2007-07-24
北海道利尻島は、北海道の美味しいうにや魚が食べることが出来 観光名所もたくさんある観光地です 北海道札幌から始まり全道の観光地、観光名所、市町村の情報紹介 2007-07-22
北海道広尾町は、いつも峠越えで行ってましたがたまには黄金道路いいですね 広尾町は観光できますし 海産物も美味しいですね 北海道札幌から始まり全道の観光地、観光名所、市町村の情報紹介 2007-07-21
ラベンダーといえば北海道の富良野ですね この富良野は観光名所であり 北海道観光の目玉ツアーの1つです 北海道札幌から始まり全道の観光地、観光名所、市町村の情報紹介 2007-07-19
Categories
RBR (3)
CBR1100XX (13)
KDX250SR (6)
バイクネタ (70)
ツーリング (16)
エヴォIV (49)
べるさん (16)
物欲 (32)
鯖立て (9)
Zope&Plone (13)
スキー (46)
WORKS (9)
PC (9)
雑記 (117)
moblog (72)
iPhone (5)
走行会とか (9)
平均価格 ランキング
swf images
 
Document Actions

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のリスト とか、ホワイトリスト とか変えたいですし。

参照させていただいたサイト

by maru posted at 2007-12-01 16:19 last modified 2007-12-01 17:10
The URL to Trackback this entry is:
http://www.maruz.net/blog/148/tbping
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)