at posts/single.html

コメント SPAM 対策 - 日本語を含まないコメントを禁止

小ネタ。 コメント SPAM 対策のため、 tDiary の SPAM フィルタや PukiWiki にて、DNS ブラックリストによる SPAM フィルタリングを使っている。 でも、最近はフィルタリングをすり抜けてくるコメント SPAM も増えているので、思い切って日本語を含まないコメントを禁止した。

ASCIIコードを見ながら、半角英数(1バイト文字)にマッチする正規表現を書いてみた(これが言いたかっただけだったり)。

/^[!-~ ]+$/

最初は記号を全部列挙していたんだけど、ハイフンを使って範囲指定すれば楽だね。

追記 (2006/09/02)

上の正規表現だと行単位のマッチになるので、1行だけ日本語が含まない行があった場合でもマッチしてしまう。 「^$」の代わりに「\A\Z」を使った方がいいね。

/\A[!-~ ]+\Z/

さらに追記 (2006/09/08)

あぁ。また間違ってた。 「\A\Z」を使う場合は、改行も指定してあげないとダメだ。 9月2日の例だと、2行以上で全て英数の文字にマッチしない。

/\A[!-~\n ]+\Z/

これでいいのかな? 時間が無くてちゃんと確かめられてないけど。 NTさんとこだと^$でも問題ないみたいだし、僕の例だと中国語や韓国語の SPAM に対応できないという指摘も頂いたし。

→ やっぱり動いてない気がする…orz。 確実に対処したい人は、きたさんのひらがなフィルタを使った方がいいかも。

/^[!-~ ]+$/m

とりあえず、元の^$方式に複数行オプション(m)をつけたら,tDiaryは動くようになった。 自信ないけど、時間も無いのでとりあえずこれで。 でも何故か、PukiWikiはこれでは上手くいかない。

tDiary 版

「tdiary/filter/japanese.rb」を作成した。

module TDiary
  module Filter
    class JapaneseFilter < Filter
      def comment_filter( diary, comment )
        if comment.body.match(%r|^[!-~ ]+$|m)
          false
        else
          true
        end
      end
    end
  end
end

PukiWiki 版

pukiwiki.ini.php の末尾に関数を記述する。

function check_commentFilter($msg) {
  if(preg_match("/^[!-~\n ]+$/", $msg)) {
    die_message('日本語を含まないコメントは書き込みできません。');
  }
}

ページの編集、コメント投稿の時に、この関数を使ってコメントに半角英数記号以外が使われているかどうかをチェックしている。

plugin/edit.inc.php

function plugin_edit_action()
{
  global $vars, $_title_edit, $load_template_func;

  if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');

  $page = isset($vars['page']) ? $vars['page'] : '';

  check_editable($page, true, true);
  check_commentFilter($vars['msg']);

plugin/comment.inc.php

function plugin_comment_action()
{
  global $script, $vars, $now, $_title_updated, $_no_name;
  global $_msg_comment_collided, $_title_comment_collided;

  if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
  check_blackList($vars['page']);
  check_commentFilter($vars['msg']);

plugin/pcomment.inc.php

function plugin_pcomment_action()
{
  global $vars;
  if (PKWK_READONLY) die_message('PKWK_READONLY prohibits editing');
  check_commentFilter($vars['msg']);

小ネタなのでこれくらいに。

関連する日記