これまで3度に渡って実験してきたコメントスパム弾き実験をまとめます。
- JavaScript で hidden な input を埋め込んでうんぬんする方法: 基本的には JavaScript を無効にしている人にとっては、一旦有効にしてからリロードして...とめんどいし、そのハンドリングを考えるとめんどいので却下。
- DTML で hidden な input を埋め込んでうんぬんする方法: 具体的には時刻情報を埋め込んで、POSTされるときの時刻から許容できるずれ幅を超えていたらはねていました。当初は15分にしていたけど、あまりにも短すぎるとの声があったので、30分に変更。で、この方法はロボットがつけるようなコメントスパムには効きそうに思うけど、実際にブラウザからコメントスパムをつけているようなケースがあったのでこれだけじゃ駄目ぽ。
- コメントの文中にURL欄に記したURLのホスト部が多数あった場合は弾く方法: これは効きました。でもUIでかなり手を抜いたので、悪意のない場合にわけがわからんことになる。もしかしたら単にコメントの文中にリンクが多数あったらというので良いのかも。

で、で、で、そんなおり、COREBlog1.2.1がリリース — 清水川 Webで beforeAddComment の使用例が公開されたので、これを元にこれまで Entry.py などでごにょごにょと怪しいことをしていた部分をなるべくこっちに持ってきて変更しました。
ちなみに、 beforeAddComment や beforeAddTrackback というフック関数は今回のリリース(1.2.1)で追加されました。
ということで、ちょっと長いですが 1.2.1 に対して行った変更(コメントスパムうんぬんとは関係ない部分もありますが、そこは僕の備忘録ということで)。

- stripogram/html2safehtml.py: 60行目, 閉じタグの不要なものは /> で終える
self.result = self.result + '>'
↓↓↓↓↓↓↓↓↓↓
if tag in self.never_close:
    self.result = self.result + ' />'
else:
    self.result = self.result + '>'

- dtml/manage_listTrackbackForm.dtml: 66行目, トラックバックの管理画面の DTML
<input type="checkbox" name="mod_ids:list" value="<dtml-var id>" <dtml-if moderated>checked<dtml-else></dtml-if>/>
↓↓↓↓↓↓↓↓↓↓
<input type="checkbox" name="mod_ids:list" value="<dtml-var id>" <dtml-if moderated>checked<dtml-else></dtml-if> />

- Entry.py: 482行目, 引数 published を追加
    def addComment(self,title,author,body,moderated = 1,email="",url="",created="",REQUEST=None):
↓↓↓↓↓↓↓↓↓↓
    def addComment(self,title,author,body,moderated = 1,email="",url="",created="",published=0,REQUEST=None):

- Entry.py: 507-508行目, 引数 published を追加
        d = call_before_addcomment_hook(self.aq_parent,comment_id,self.id,\
                                title,author,body,int(moderated),email,url)
↓↓↓↓↓↓↓↓↓↓
        d = call_before_addcomment_hook(self.aq_parent,comment_id,self.id,\
                                title,author,body,int(moderated),email,url,published)

- utility.py: 196-197行目, 引数 published を追加
def call_before_addcomment_hook(site,id,parent_id,title,author,body, \
                                moderated,email,url):
↓↓↓↓↓↓↓↓↓↓
def call_before_addcomment_hook(site,id,parent_id,title,author,body, \
                                moderated,email,url,published):

- utility.py: 207行目, d に published をキーとする要素を追加
    d["published"] = published

と、ここまでは展開したファイルを編集。
次に COREBlog オブジェクト内のコンテンツから以下を編集。

- comment_form, form に hidden な input を追加
<input type="hidden" id="published" name="published" value="<dtml-var "int(ZopeTime().timeTime())">" />

- methods/beforeAddComment, パラメータを d として以下のスクリプトを追加(gap は許容時間を秒単位で)
now = int(DateTime().timeTime())
url = d["url"]
site = url.split('/')[2]
body = d["body"]
published = int(d["published"])

gap = 1800 # seconds

try:
     if not d["moderated"]:
          return d

     if url.count('http://') and body.count(site) > 5:
          # links to same site are greater than 5 ....., maybe spam
          d["moderated"] = 0
     elif not same_type(published, 1234):
          # "published" is not Integer ....., maybe robot's comment
          d["moderated"] = 0
     elif published < now - gap or published > now + gap:
          # published is too older or too newer ....., maybe robot's comment
          d["moderated"] = 0
     else:
          d["moderated"] = 1
except:
     pass

return d
Posted by setomits at 03:51 | Comments: 0
Leave a comment
Required fields are marked with *
search
calendar
Nov 2009
SunMonTueWedThuFriSat
1234567
891011121314
15161718192021
22232425262728
2930     
archives
photos on flickr
www.flickr.com
bookmarks on delicious