コメントスパム対策

Blogn(ぶろぐん)のスパム対策は IP アドレスではじくしか方法がありません。
それだけでは心許ないのでコメントに対して禁止ワードを設定できるように改造してみました。

説明

URL またはコメント欄に禁止ワードが含まれていた場合、コメント欄に「コメントに禁止ワードが含まれていたため、表示が規制されました」と表示します。同時に URL も空欄にします。

禁止ワードは「ngwd.dat」というファイルで設定します。

例(禁止ワードに「poker」を設定した場合)

その1. コメント欄に禁止ワード Part1

コメント欄に禁止ワードが見つかった場合、コメントはあらかじめ決められた文字列に置換。スパマーのアドレスも空欄にする。

名前 = Party Poker
URL = http://www.●●●.com/
コメント = You are invited to check out some information about party poker http://www.●●●.com/

名前 = Party Poker
URL =
コメント = コメントに禁止ワードが含まれていたため、表示が規制されました。

その2. URL欄に禁止ワード

URL欄に禁止ワードが見つかった場合も上と同じ動作。

名前 = Party Poker
URL = http://www.poker-●●●.com/
コメント = You are invited to check out some information.

名前 = Party Poker
URL =
コメント = コメントに禁止ワードが含まれていたため、表示が規制されました。


その3. コメント欄に禁止ワード Part2

大文字・小文字だろうが区別なく規制できます。

名前 = Party Poker
URL = http://www.●●●.com/
コメント = You are invited to check out some information about PARTY POKER http://www.●●●.com/

名前 = Party Poker
URL =
コメント = コメントに禁止ワードが含まれていたため、表示が規制されました。


Blogn(ぶろぐん)v1.9.2 の場合

コメント欄

index.php 内の981〜988行目の下に赤い文字の部分を追加

//テキスト整形
$c_name = CleanStr($c_name);
$c_email = CleanStr($c_email);
$c_url = CleanStr($c_url);
$c_mes = CleanStr($c_mes);
if (CSIZEMAX) $c_mes = mbtrim($c_mes,CSIZEMAX);
// 改行文字の統一。 
$c_mes = rntobr($c_mes);

// 使用禁止ワード
$c_message = strtolower($c_mes);
$data = fopen(LOGDIR."ngwd.dat", "r");
$deny = fgets($data, 1024);
$ng_word = explode(",", $deny);
if (is_array($ng_word)) {
  foreach ($ng_word as $deny_wd) {
  if (preg_match("/$deny_wd/", $c_message) || preg_match("/$deny_wd/", $c_url)) {
      $c_mes = "コメントに禁止ワードが含まれていたため、表示が規制されました。";
      $c_url = NULL;
    }
  }
}
fclose($data);

禁止ワード設定ファイル

テキストファイルに禁止ワードを羅列する。
このファイルを「ngwd.dat」という名前で保存し、Blogn がインストールされているディレクトリ下の「log」ディレクトリにアップロードする。

設定ファイルはこんな感じ(↓)

casino,poker,viagra,texas,ランキング

注意事項

禁止ワードは「URL」と「コメント」欄の中身に対して有効です。はじきたいサイトのアドレスの一部を入れると良いでしょう。

更なる改造

メッセージを変更する

上の改造例では規制にひっかかった場合「コメントに禁止ワードが含まれていたため、表示が規制されました。」と表示されますが、好きな文字列にする事が可能です。下記の緑色の部分を書き換えてください。

$c_mes = "コメントに禁止ワードが含まれていたため、表示が規制されました。";

書き込んでもエラーにする

もし書込み自体させたくない場合は、以下のように記述すれば OK。
変更箇所は青字の部分だけ。

//テキスト整形
$c_name = CleanStr($c_name);
$c_email = CleanStr($c_email);
$c_url = CleanStr($c_url);
$c_mes = CleanStr($c_mes);
if (CSIZEMAX) $c_mes = mbtrim($c_mes,CSIZEMAX);
// 改行文字の統一。 
$c_mes = rntobr($c_mes);

// 使用禁止ワード
$c_message = strtolower($c_mes);
$data = fopen(LOGDIR."ngwd.dat", "r");
$deny = fgets($data, 1024);
$ng_word = explode(",", $deny);
if (is_array($ng_word)) {
  foreach ($ng_word as $deny_wd) {
  if (preg_match("/$deny_wd/", $c_message) || preg_match("/$deny_wd/", $c_url)) {
      return 1;
    }
  }
}
fclose($data);

「コメントが投稿できませんでした。サイト管理人へディレクトリのパーミッションを確認してください。」と表示されます。

名前・メールアドレスにも禁止ワード

コメントと URL だけではなく、投稿者の名前とメールアドレスにも禁止ワードで規制したい場合は

if (preg_match("/$deny_wd/", $c_message) || preg_match("/$deny_wd/", $c_url)) {

を以下のように記述してください(↓改行されていますが、実際は1行です)。

if (preg_match("/$deny_wd/", $c_message) || preg_match("/$deny_wd/", $c_url) || preg_match("/$deny_wd/", $c_name) || preg_match("/$deny_wd/", $c_email)) {

サイト作成のヒント集に戻る