spam対策少しだけ強化
前に書いたspam対策フィルタをトラックバックspamに対応させてみた。とは言っても、軽めのものが良いなと思っているのでリンク先を調べに行って何かするといったことはしていない。以下のチェックにひっかかったものをspamとみなし、コメントとトラックバックは非表示にして記録、リファラーは他にしようがないのでそのまま捨てている:
- REQUEST_URIが
/./ - メールアドレスが明らかに不正
- メールアドレス用のブラックリストにマッチする
- コメント本文に
href=を含む - コメント本文にURIがたくさん含まれている(10個より多い、とか)
- コメントのほとんどがURIで占められている(バイト数の割合)
- コメント本文にURI用のブラックリストにマッチするURIが含まれている
- トラックバックのURIがトップページ(http://example.jpとか)を指している
- トラックバックのURIが明らかに不正
- トラックバックのURIがHTTP(S)以外である
- トラックバックのURIのホスト名をアドレス解決できない
- トラックバックのURIのホストとトラックバックを送ってきたホストがまるで違う
コードはこんな感じ。これをspam.rbというファイル名でtdiary/filter以下(default.rbのあるディレクトリ)に置いて、はじめのほうでNGワードなどの設定をすれば使えるはず。ただしuriとresolvを使っているのでRuby 1.8以降でないとダメ。
追記(2005-06-30): もう少しだけいじって設定画面で調節できるようにした → こちら
追記(2005-07-01): mod_rubyを使っていて複数の日記を提供する環境での動作確認はしていないので、そういう環境ではうまく動かないことがあるかもしれない。
TDiary::Comment#visible? v.s. TDiary::Comment#visible_true?
いろいろテストしている中でtDiaryのキャッシュを削除したとたんにトラックバックが非表示になってしまった。アレレと思ってデータを見てみるとたしかに「Visible: false」になっている。おかしいなと思いつつもデータをいじって再び表示するようにしたのだが、その後さらにテストを繰り返していくと、新たに加わったトラックバックの状態がおかしくなるという現象が起きた。状況は同じで、キャッシュを消すとそれまで表示されていたトラックバックが表示されなくなる。ただし、一度表示状態を設定すると大丈夫のようだ。
加えて、先に手を入れたmail.rtxtの表示もおかしくなっていることがあるのに気付いた。トラックバックの時に限ってだと思うのだけど、ブラウザ上ではたしかに表示されているのにメールでは「VISIBLE: no」になっていることがある。
手の付けやすそうなmail.rtxtで@commentをinspectしてみると@showはtrueになっているのに@comment.visible?がfalseとなる場合があることが分かった。どうもよくわからないのでgrepしてみるとtb-showでTDiary::Comment#visible?を再定義しているようだ。
#
# hide TrackBacks in TSUKKOMI
#
eval( <<MODIFY_CLASS, TOPLEVEL_BINDING )
module TDiary
class Comment
def visible_true?
@show
end
#{if @mode !~ /^(form|edit|showcomment)$/ then
'def visible?
@show and /^(TrackBack|Pingback)$/ !~ name
end'
else
'def visible?; @show; end'
end}
end
end
MODIFY_CLASS
うーん、もしかして、これってmod_rubyだとまずかったりするのかな? ……するような気もする。……よく分かんないけど。とりあえずtdiary.rbのTDiary::Commentにもvisible_true?を定義して、mail.rtxtの「VISIBLE」の部分とdefaultio.rbのコメントデータをセーブする部分ではvisible_true?を使うようにしてみよう。
2.0.1へアップグレード
自分で手を入れた部分があったり個々に更新していたプラグインがあったりで2.0.0→2.0.1にするのがおっくうだったのだけど、いつまでも放っておくのもいかんのでアップグレードしてみた。以下、やったことのメモ:
- calendar2を祝祭日対応にした。前にやったのそのまま。
- bk2プラグインを追加した。
- bk2プラグインとの相性なのかもしれないけど、amazon.co.jpにない書籍へのリンクを置くと例外が上がるようになったのでamazon.rbを以下のように変更した。
--- ../tdiary-2.0.1.orig/misc/plugin/amazon.rb 2005-03-11 16:45:23.000000000 +0900 +++ misc/plugin/amazon.rb 2005-04-14 20:52:37.000000000 +0900 @@ -138,7 +138,11 @@ end r << %Q[</a>] rescue NameError, StandardError - %Q[<a href="#{item[0].strip}/ref=nosim/">#{asin}</a>] + if item.nil? + asin + else + %Q[<a href="#{item[0].strip}/ref=nosim/">#{asin}</a>] + end end end - disp_referrerをtrunkのものにした。
- disp_referrerに手を入れて一日表示のときにもアンテナや検索エンジンからのリンクを表示させないようにした。これも基本的に前にやったのそのままだが今回は設定できるようにしてみた。
Index: disp_referrer.rb =================================================================== RCS file: /cvsroot/tdiary/plugin/disp_referrer.rb,v retrieving revision 1.51 diff -u -r1.51 disp_referrer.rb --- disp_referrer.rb 3 Mar 2005 21:31:11 -0000 1.51 +++ disp_referrer.rb 14 Apr 2005 15:46:14 -0000 @@ -473,12 +473,16 @@ # 通常のリンク元のタイトルです。デフォルトでは、「本日のリンク元」です。 'antenna.label' => Disp_referrer2_antenna_label, # アンテナのリンク元のタイトルです。 + 'antenna.hide' => false, + # trueの場合は表示しません 'unknown.label' => Disp_referrer2_unknown_label, # その他のリンク元のタイトルです。 'unknown.hide' => false, # trueの場合はリンク元置換リストにないURLは表示しません 'search.label' => Disp_referrer2_search_label, # 検索エンジンからのリンク元のタイトルです。 + 'search.hide' => false, + # trueの場合は表示しません 'unknown.divide' => true, # trueの場合、置換リストに無いURLを通常のリンク元と分けて表示します。 # falseの場合、置換リストに無いURLを通常のリンク元と混ぜて表示します。 @@ -585,8 +589,12 @@ self['limit'][c] = @limit || 0 end end - if self['unknown.hide'] and not /\A(append|replace|edit)\Z/ =~ @mode then - self['limit'][DispRef2URL::Unknown] = 0 + [['antenna.hide', DispRef2URL::Antenna], + ['search.hide', DispRef2URL::Search], + ['unknown.hide', DispRef2URL::Unknown]].each do |k, c| + if self[k] and not /\A(append|replace|edit)\Z/ =~ @mode then + self['limit'][c] = 0 + end end self end @@ -1241,7 +1249,7 @@ %w( antenna.group antenna.ignore_parenthesis antenna.search.expand normal.categorize normal.group normal.ignore_parenthesis search.expand long.only_normal short.only_normal no_cache unknown.divide - unknown.hide + antenna.hide search.hide unknown.hide ).each do |key| tdiarykey = 'disp_referrer2.' + key case @cgi.params['dr2.' + key][0] Index: ja/disp_referrer.rb =================================================================== RCS file: /cvsroot/tdiary/plugin/ja/disp_referrer.rb,v retrieving revision 1.22 diff -u -r1.22 disp_referrer.rb --- ja/disp_referrer.rb 22 Feb 2005 03:59:46 -0000 1.22 +++ ja/disp_referrer.rb 14 Apr 2005 15:46:14 -0000 @@ -255,6 +255,14 @@ <td><input name="dr2.unknown.divide" value="true" type="radio"#{' checked'if @setup['unknown.divide']}>#{@setup['unknown.label']}として分ける <td><input name="dr2.unknown.divide" value="false" type="radio"#{' checked'if not @setup['unknown.divide']}>通常のリンク元と混ぜる。 <tr> + <td>#{@setup['antenna.label']}を + <td><input name="dr2.antenna.hide" value="false" type="radio"#{' checked'if not @setup['antenna.hide']}>表示する + <td><input name="dr2.antenna.hide" value="true" type="radio"#{' checked'if @setup['antenna.hide']}>隠す。 + <tr> + <td>#{@setup['search.label']}を + <td><input name="dr2.search.hide" value="false" type="radio"#{' checked'if not @setup['search.hide']}>表示する + <td><input name="dr2.search.hide" value="true" type="radio"#{' checked'if @setup['search.hide']}>隠す。 + <tr> <td>#{@setup['unknown.label']}を <td><input name="dr2.unknown.hide" value="false" type="radio"#{' checked'if not @setup['unknown.hide']}>表示する <td><input name="dr2.unknown.hide" value="true" type="radio"#{' checked'if @setup['unknown.hide']}>隠す。 - 自作プラグインなど使用中の小物プラグインを追加した。
- ツッコミメールにIPアドレスと表示・非表示の状態を入れるようにした。こんな感じ:
--- ../tdiary-2.0.1.orig/skel/mail.rtxt 2004-05-20 23:24:26.000000000 +0900 +++ skel/mail.rtxt 2005-04-15 00:34:54.298351074 +0900 @@ -14,3 +14,5 @@ <%= body %> -- <%= @conf.index =~ %r|^https?://|i ? '': @conf.base_url %><%= @conf.index.sub(%r|^\./|, '') %><%= anchor(@date.strftime('%Y%m%d') + ('#c%02d' % serial)) %> +IP: <%= ENV['REMOTE_ADDR'] %> +VISIBLE: <%= @comment.visible? ? 'yes' : 'no' %> - tdiary/defaultio.rbのロックまわりの修正を加えた。内容はtdiary-develで報告された通りで、コードはRelease_2_0_1→HEADの差分を参考にした。
- tdiary/filter/spam.rbを書いた。
追記: 「ロックまわりの修正」については細かく分けてロックをかけるほう(メールの後半のほう)を適用したのだけど、スレッド対応MPMを使っている環境だとどうもうまくないような感じがする。ちゃんと調べてないけどもしかするとデッドロックぎみになってしまうことがあるのかも? ということで、例外が上がってもロックが解除されるようにだけすることにした。