2005
Oct
12th
これまで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)で追加されました。
- 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行目, 閉じタグの不要なものは /> で終える
- dtml/manage_listTrackbackForm.dtml: 66行目, トラックバックの管理画面の DTML
- Entry.py: 482行目, 引数 published を追加
- Entry.py: 507-508行目, 引数 published を追加
- utility.py: 196-197行目, 引数 published を追加
- utility.py: 207行目, d に published をキーとする要素を追加
と、ここまでは展開したファイルを編集。
次に COREBlog オブジェクト内のコンテンツから以下を編集。
- comment_form, form に hidden な input を追加
- methods/beforeAddComment, パラメータを d として以下のスクリプトを追加(gap は許容時間を秒単位で)
- 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