ニートワークエンジニア

浪人、留年、休学、中退、ニート、エンジニア。回り道人生を謳歌中

20,000件に及ぶWordPressのスパムコメントを処理

Spam wallSpam wall / freezelight

完全放置で自動運用しているまとめサイトがある。2ちゃんねるから適当なスレを取ってきてテキトーに並び替えてテキトーにフォントサイズや色を変えてそれっぽく整形して記事として投稿、という一連の操作をプログラムが自動で行うテキトーなまとめサイトだ。

数カ月ぶりにWordPressの管理画面を覗いてみると未読コメント件数がなんと2万を超えていた。まあほとんどがスパムである。WPは記事毎にコメントを受け付けるかどうかの設定ができるのだが、そのパラメータが'open'、つまり誰でもコメントを投稿できる設定になっていたのだ。

設定->ディスカッションというページで新しく投稿された記事に関してはデフォルトでコメントを受け付けないようにできるのだが、この方法では既存の記事に対してコメントを無効化できない。

コメントフォームを非表示に

どうせゴミサイトだし無駄にトラフィックを増やすだけのコメント機能は完全に無くてよいので、テンプレートをいじってコメント表示部分を完全に消してみる。単一記事ページを構成するsingle.phpの中のcomments_template();という部分をコメントアウト。これでコメントフォームを非表示にできた。しかし甘かった。

数時間後に再び管理画面を開くとスパムコメントが更に100件近く増えていた。どうやらスパムボットはPOST用のURLを直接叩いているのでコメントフォームを消そうが関係ないようだ。

記事毎のコメント許可設定

記事編集画面で個別にコメント不許可の設定ができることにはできるのだが、記事数が6万件近くあるので直接データベースを叩くことにした。

phpMyAdminからSQL発行ページを開く。記事毎の設定はwp_postsというテーブルに格納されており、コメント許可設定はcomment_statusで、トラックバック許可設定はping_statusというキーのようだ。update wp_posts set commnet_status='closed' , ping_status='closed'というクエリで全ての記事についてコメントとトラックバックを禁止にできた。

コメントの一括削除

コメント自体はwp_commentsというテーブルに保存されているが、大量のスパムコメントによって既に数GBに肥大化していた。中には日本語の真っ当なコメントも含まれていたのかもしれないが、どうせゴミサイトだし迷うこと無く全てのレコードを一括削除した。

コメント関連のプラグインを使えばスパムをフィルタリングしたり一括設定ができるようだが、基本的に自分が理解できる範囲はシンプルにこなしたいタチなので今回のような手段をとった。

 

それにしても久々にWordPressを触ってみたのだが、管理画面のインターフェイスの洗練さに感動した。以前と比べるとJavaScriptがふんだんに使われているが、決して派手さではなく操作性の面で適切に役目を果たしている。どっかの無料ブログとは大違いだ…。