今朝ブログをチェックすると山のようなコメントが!って喜んではいけません(^^;
コメントスパムが投稿されてました。どうも最近流行っているようでそれが遂にこんなマイナーなブログにまで来たと言う事のようです。今回のはなんか texas hold em とか言う物でした。
さてその対処をしたので興味のある方のみ続きをご覧下さい。
ご注意:以下の対処を真似する場合には全て自己責任でお願いします。
まずスパムのコメントを削除しようとしました。が、メニューからやっていたのでは大変です。Nucleusだと1つずつしか削除が出来ません。う~んと思ってググってみると、なるほどSQLで削除する手があったか。今回のスパムは "texas" と言うリンクが本文に必ずありました。そこでサーバにログインして直接これを削除しましょう。え~とMySQLなんだよなぁ…あれ?MySQLのパスワードとかは何にしたっけか?とお悩みの方はNucleusフォルダの中にあるconfig.phpを参照しましょう。さすれば悩みは解決するはずです。では以下に私のやった手順を。
$ mysql -u root -p
Enter password:(パスワードは config.php にあるはず)
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 65274 to server version: 4.0.20-Max
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> connect blog
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Connection id: 65275
Current database: blog
mysql> select * from nucleus_comment where cbody like "%texas%";
(この後該当するコメントが表示されるので確認)
(今回はキーワードに texas を指定したが任意に変更する事)
:
(全て削除して良いかどうかを判断してOKなら以下のdeleteを実行)
mysql> delete from nucleus_comment where cbody like "%texas%";
Query OK, 32 rows affected (0.00 sec)
mysql> exit;
Bye
$
まずselect文を使って対象となるコメントだけが選択可能かどうかをチェックします。その上でdelete文で削除しましょう。delete文を誤って使うと取り返しがつかないので自信が無い方はやらないように。つまりは自己責任でお願いします。私の場合は上記でうまく削除できました。
次にスパムの投稿を避ける手段を考えてみました。どうせ投稿は自動で行ってくるのだから、何か簡単なパスワードを付けるだけでも効果があるように思います。なのでログインしていないゲストによるコメント投稿時にパスワードをチェックするようにしてみます。
まずは nucleus/forms/commentform-notloggedin.template を編集します。必ずバックアップを取っておきましょう。その上で10行目に以下の行を追加しました。
<label for="nucleus_cf_passwd">PASSWD</label>
: <input name="passwd" size="40" maxlength="40" class="formfield" id="nucleus_cf_passwd" />
hint: "langedge"
<br />
次に投稿する action.php にチェックを追加します。これも忘れずにバックアップを取ってからにしましょう。68行目に以下の行を追加しました。
$passwd = postVar('passwd');
if($passwd != 'キーワード') {
doError('invalid passwd', new SKIN($blog->getDefaultSkin()));
return;
}
さてこれでチェックしているはずなんですが…コメントスパムが無くなるかどうかは暫らく待たないと分からないです(^^;
ちなみにうちのサイトではキーワードは社名のラングエッジを英語8文字を使っています。langedge ですね。分かり難い?
[追加]
ついでにどこから来たかもチェックするようにしてみました。action.php の先に追加したパスワードチェックの前に以下を挿入。
$HTTP_REFERER = $_SERVER['HTTP_REFERER'];
$i = strpos($HTTP_REFERER, 'http://www.langedge.jp/');
if($i != 0) {
doError('invalid server', new SKIN($blog->getDefaultSkin()));
return;
}
これで外部からの投稿は防げるはず。この2段構えのトラップで防げると良いのですが。
[追加2]
パスワードの追加をしたら、ログインした時も弾かれてしまう事が判明(笑) nucleus/forms/commentform-loggedin.template に
<input type="hidden" name="passwd" value="キーワード" />
を追加。埋め込んでしまうのはここに来る時にはパスワードを使ってログインしているはずなので。
まずは変なパスワード "aaa" を入力…おぉエラーになる。
次は正しいパスワード "langedge" を入力…どうかな?…OKですね。