以前も書いたけど、そのページは事故で消えましたorz
数ヶ月たつけど荒らしにはあってないので、方法を紹介だけします。
まず、スパムは人間ではありません。ロボットです。なので、ちゃんと理解して対策をとれば防ぐことができます。まだまだロボットでは人間さまにかなわないのです。
スパムがロボットであるという前提に立って考えてみます。ロボットはどうやって、コメントフォームを捜すのでしょうか?
Googleのクローラーと同じ。リンクを辿ってやってくるのです。そして、まあ単純に考えて、formタグを捜すのでしょう。
(あくまで推測)
というわけで、ロボットに対抗するために考えられる方法は↓。
とそんなことを考えて、このサイトでとってる方法。
フォームタグをHTML中に書きません。Javascriptのdocument.writeで書きます。
PHPでやる場合のソース↓。
<div id="hoge">ふぉーむ</div>
<script type="text/javascript">
document.getElementById("hoge").innerHTML = "<?
ob_start();
?>
フォームをここに書く
<form ……
……
</form>
<?php
$h = ob_get_contents();
ob_end_clean();
$h = preg_replace_callback(
'/[<"\'>&aiueo\n\r\\\\]/' , 'ordChar' , $h);
echo $h;
?>";
</script>
<?php
function ordChar($matches)
{
return '"+String.fromCharCode(' . ord($matches[0]) . ')+"';
}
HTML特殊文字と、\とあとてきとうに何文字かを
String.fromCharCode()
に変換。これで、formという単語すらなくなります。ロボットでは、フォームがあることがわかりません。
もっとも、ロボットがJavascriptを解釈しはじめたら別。そうなったら別の方法を考えるしかない。
この方法の欠点は、すでにスパムサーバのDBに登録されてしまっているページでは効かないかもしれないというところ。まあ、そういうDBがあるのかどうかは知らないけど。
もちろんほかにも方法はある。