JeffreyFrancesco.org 公開日 タグ Tag Permalink 現在地 Facebook page Twitter RSS feed

前回の続き。

実は feedback プラグインを導入した最大の動機が、Akismet による強力なスパム対策。既に WordPress に標準で提供され (有効化は必要ですが) 実績を上げているとなれば、Blosxom でも使いたくなるというのが人情というもので(?)

実際に有効化するためには、Net::Akismet という Perl モジュールが必要です。モジュールがインストールできる環境にあればインストール、でなければ blosxom.cgi 本体と同じ階層に Net というディレクトリを作り、その下に Akismet.pm を置いても OK です。API Key の取得も忘れずに (取得方法の解説サイト)。

/cgi-bin + blosxom.cgi
         |
         - /Net        - Akismet.pm

で、実際にスパムと判断されそうな適当なコメント (“casino” とか “poker” とかのキーワードを入れたもの) を投稿してみましたが…普通に通ってしまいます。アレ? ローカルでやってるからダメなの? なら実際に構築したサイトの方でテスト。

…やっぱり普通に通ってしまいます。適当な他のサイトからスパムっぽいコメントを拾ってきて、そのままコピペして投稿しても通ってしまう。ダメじゃん。

で、サーバのエラーログを見てみますと、何か Use of uninitialized value in string eq ていうエラーが一杯出てる。「初期化されていない変数が比較に使われてる」というエラーだそうで。エラーが出てる部分のプラグインのスクリプトは:

    return 1 if $akismet->check(%fields) eq 'true';

ということは、$akismet->check(%fields) が初期化されていないって事でしょうか? その少し前のコードにて:

    # Attempt to connect to the Askimet service.
    my $akismet = Net::Akismet->new(KEY => $wordpress_api_key,
                    URL => $blosxom::url);
    unless ($akismet) {
    warn "feedback: Akismet key verification failed\n";
    return 0;
    }

    # Set up fields to be verified. Note that we do not use the REFERRER,
    # PERMALINK, or COMMENT_AUTHOR_EMAIL fields supported by Akismet.

    my %fields = (USER_IP => $ENV{'REMOTE_ADDR'});
    if ($is_comment) {
    $fields{COMMENT_TYPE} = 'comment';
    $fields{COMMENT_CONTENT} = $$params_ref{'comment'};
    $fields{COMMENT_AUTHOR} = $$params_ref{'name'};
    $fields{COMMENT_AUTHOR_URL} = $$params_ref{'url'};
    } else {
    $fields{COMMENT_TYPE} = 'trackback';
    $fields{COMMENT_CONTENT} =
        $$params_ref{'title'} . "\n" . $$params_ref{'excerpt'};
    $fields{COMMENT_AUTHOR} = $$params_ref{'blog_name'};
    $fields{COMMENT_AUTHOR_URL} = $$params_ref{'url'};
    }

ってやってるんだけど。で、上記と同じように %fields を埋めたテストスクリプトを書いて走らせてみると、どうも $akismet->check(%fields)undef を返しているようです。うーん…という訳で、Net::Akismet の和訳ドキュメントを読んでみると:

COMMENT_USER_AGENT

必須。コメント投稿者のユーザーエージェント文字列を示します。

ってなってる。改めて先のコードを見直すと、%fieldsUSER_IP は設定されてるけど、COMMENT_USER_AGENT が設定されていません。なるほど、必須パラメータが抜けてるので、undef を返してるんですね。という訳で、コードを以下のように手直し。

    my %fields = (USER_IP => $ENV{'REMOTE_ADDR'});
    # 追加部分
    $fields{COMMENT_USER_AGENT} = $ENV{'HTTP_USER_AGENT'}

これで改めてテストコメントを投稿しますと、今度はちゃんと弾いてくれました。ほっ。

次回は、コメントの処理まわりをもう少し弄ってますので、その辺の解説を。でも一旦この話題はしばらく休むかも。