れいぶろぐゲームをプレイしたり、作ったりしてる人、LABEのブログ『れいぶろぐ』。創作のこと、PCのこと、その他趣味のことを広く浅く。(4)ブログをやっているとよく遭遇するのがスパムコメントだ。人類とスパムとの争いは永遠のテーマだろう。スパムコメントを防ぐため、CAPTCHAなどの対策を講じているが、あまりユーザー側に負担を求めるとコメントする敷居が高くなる。そこで、できるだけサーバ側で対処する方法を取っている。コメントを判別して拒否するための方法を調べてみた。まとめどこに関数をフックするかWordPressにおいて、コメントはどの関数を使い、どのように記録されるのか。いう関数を使ってコメントを処理しているようだ。この関数のソースから、使えそうなフィルターもしくはアクションを探す。次にこの関数を辿ってみる。この関数ではコメントデータの整形、チェック、そしてデータベースへの記録をしており、そして以下の三つの関数が使われている。コメントの各データに適用するフィルターがまとめてある。コメントを承認するかどうかを決定する。コメントをデータベースに記録する。この関数では様々な方法でコメントが適切かどうかを判定しており、なかなか興味深いので一度は見ておいてもいいと思う。返すことでエラーを表示させてコメントを却下することができる。却下とはすなわち、コメントを受け取っていない扱いになる。フィルターが今回の目的において最もふさわしい。いうことで、このフィルターに関数をフックすることにしよう。);エラーを吐かせるならこんな感じ。);}これで、条件に当てはまるコメントが投稿された時、あのWordPress特有の真っ白なエラー画面に、設定したメッセージが表示され、コメントは却下される。URLフィールドが空でない場合に拒否このサイトでも二つほどスパム対策のプラグインを使用しているのだが、それでもなおスパムコメントが来ることがある。手動なら仕方ないが、手動でもないようなパターンが。ご覧の通り、このサイトのコメントフォームには「URL」の入力欄がないのだが、このサイトの従来のスパム対策をすり抜けてくるスパムコメントにはURLが設定されているのだ。WordPressのコメントなんて、PHPを直接POSTアクセスで叩けば投稿できるというから、HTMLがどうなっているかに関わらず、スパムbotにとってURL欄は「あるもの」として扱われているのではなかろうか。......よろしい、ならば戦争だURLを勝手に投稿しようとする輩は、問答無用でコメントを却下してやろうじゃない。そこで俺が書いたのが以下のコード。);2〜3行目は、すでにコメントが「承認」以外で判定されている場合、そのままにする。4〜6行目は、ログイン済みのユーザーによるコメントは「承認」にする。ログイン済みのユーザーのコメントには自動的にプロフィールのURLが含まれてしまうため、こうしないと以下のコードにより却下されてしまう。7〜8行目は、URL欄(として渡されるデータ)が空欄ならば「承認」にする。場合、テーマによっては親切にもこういった“初期値”が用意されているかもしれないといった点を想定し、これに該当するコメントを「承認」にする。12行目、上記に該当しない場合、URL欄は“不正に”入力されている状態だから、スパムとみなしてエラーを吐き出す。エラーコードとメッセージは俺のオリジナル。フィルターでエラーを吐くようにすれば、コメントを蹴ることができる、ということがわかった。これを使えばスパムコメントを拒否することができる。ところでこの記事を書いてて思ったことだが、俺ってさっきから、コメントを「蹴る」だの、「拒否する」だの、「却下する」だの、表現が全く一貫していないじゃないか。意味は似たようなものだが。俺の中では「蹴る」が一番しっくりきている。みなさんは蹴るのと蹴られるの、どちらがお好きですか?俺は......蹴りたいほどSじゃないし、蹴られたいほどMでもないな。「踏まれたい」なら、一部のキャラになら......何言ってるんだろうね。(2016/08/03)こめんとコメントはまだありません。こめんとする本文のみ必須。メールアドレスは公開されないよ。お名前メアド名前とメアドを記憶する数式の空欄を正しく埋めてね。※本文には日本語を“数文字”以上含めてね。(詳細)コメントを投稿すると、メールアドレスを含む投稿内容と、投稿者を識別するIPアドレスなどが当サイトのサーバーに送信され、保持される。これらの情報は当サイトのサービスの提供やコンテンツの改善のために利用される。あなたは、当サイトによるこれらの情報の取り扱い(取得・処理・利用)に同意しなければ、コメントを投稿することはできない。この同意の要件は法的な要件として追加されたもので、当サイトによるこれらの情報の取り扱いは従来から変わっていない。当サイトの個人情報の取り扱いについて詳しくは、プライバシー・ポリシーを読んでね。(929)※過去30日間の閲覧数データによる。