記事の詳細
bbpressに大量スパムが!対策プラグインとスパム投稿の一括削除について
今回のブログの見出しはコチラです!
bbpressを使用して設置した掲示板に大量スパム
お盆の連休明けにメールチェックをしたらありえない下図の大量メールが届いており、おかしい!ということで、調査をしてみたところ、bbPressで設置したフォーラムに1万件以上のスパム投稿がなされておりました。
これはヤバいでしょ。ということで、スパム対策と大量に届いてしまったスパム投稿の削除について書いてみます。
スパム対策にはプラグイン「bbPress Antispam」が便利です。
インストールして、有効化するだけで、ぴたりとスパム投稿が無くなりました。
こちらは、普通にプラグインを追加して有効かするだけですので、詳細は別の機会に譲ります。
さて、問題は1万件以上のスパム投稿の削除です。1件ずつ削除するのは嫌だー。。。ということで、データベースを直接いじることにしました。
スパム投稿の削除① データベースのバックアップ
phpMyAdminなどで、データベースをバックアップしておきましょう。
スパム投稿の削除② wp_postmetaのスパム関連レコードを削除
スパム投稿は、phpMyAdminでデータベースを直接更新して削除しました。
テーブルのレコード数を見ると、「wp_postmeta」と「wp_posts」のレコード数が明らかに多いので、ここにスパムレコードが紛れていることになります。
wp_postmetaテーブルの情報だけでは、どのレコードがスパムなのかは判断できません。
wp_postmetaとwp_postsを連結し、post_contentの値がすべて英文ならスパムと判定して、スパム行だけを表示するSQLを実行してみました。
また、7月1日以降にスパムが来ているため、日付を7月1日以降とし、フォーラム関係に絞りたかったので、guid列に”forum”という文字列を含むレコードのみ抽出しております。
実行したSQL文
1 2 3 4 5 6 |
select * FROM wp_postmeta AS postmeta INNER JOIN wp_posts AS posts ON postmeta.post_id = posts.ID WHERE (posts.post_date > '2016-07-01') and (LENGTH(posts.post_content)=CHARACTER_LENGTH(posts.post_content)) and (posts.post_content <> '') and (guid like '%forum%') |
実行後の結果
ここに表示されたレコードはすべてスパムとみなして、全部削除していきます。
削除するSQL文は以下を参照ください。
実行したSQL文
先ほどのSQL文の1行目「SELECT *」を「DELETE postmeta」に変えただけです。
1 2 3 4 5 6 |
DELETE postmeta FROM wp_postmeta AS postmeta INNER JOIN wp_posts AS posts ON postmeta.post_id = posts.ID WHERE (posts.post_date > '2016-07-01') and (LENGTH(posts.post_content)=CHARACTER_LENGTH(posts.post_content)) and (posts.post_content <> '') and (guid like '%forum%') |
このSQL文を実行することで、wp_postmetaテーブルからスパム関連レコードが削除されました。
スパム投稿の削除③ wp_postsのスパム関連レコードを削除
wp_postsテーブルのスパム関連レコードも削除していきます。
次のSQL文を実行します。
1 2 3 4 5 |
DELETE FROM wp_posts FROM wp_posts WHERE (post_date > '2016-07-01') and (LENGTH(post_content)=CHARACTER_LENGTH(post_content)) and (post_content <> '') and (guid like '%forum%') |
情報の整理 wp_postmetaテーブルの調整
上記SQLを実行すると、ほとんどのスパム行は消え去ります。
10件だけ残ってしまいましたが・・・(全角文字が本文内に含まれているスパム投稿です)
これら数も少ないので、後ほど手動で削除すればいいですね。
ところで、気になることが。
下図の様に、投稿数が依然として13,643件となっております。
ということで、ここも手動で修正してしまいましょう。
次のSQL文を実行します。WHERE句の条件が13643ではなく13642である理由は、投稿数は最初のトピック投稿1件を含んだ数ですので、返信数は13642であるためです。
1 |
SELECT * FROM `wp_postmeta` WHERE meta_value = 13642 |
クエリの結果は次の画面です。
各行の鉛筆のアイコンをクリックして、手動で正しい数に直してしまいます。今回は返信数は12件でしたので、13642を12に変更しました。
これで大量スパムを一気に削除することができました。
参考にされる方は自己責任でお願いいたします。また、必ずデータベースのバックアップも取得しておいてください。
コメント
この記事へのトラックバックはありません。
この記事へのコメントはありません。