NP_ProtectByMD5でスパムを軽くあしらう
2006年12月29日
夕べ、4時間ほどの間に76回のコメントスパムの攻撃を受けたが、すべてNP_ProtectByMD5でブロックした。現在、NP_ProtectByMD5のテスト期間としているのでNP_JSEncodeはコメントスパム対策としては使っていないために、この攻撃を受けたものと考えている。
結果としてはすべてブロックしたので、スパム業者は勝利を収めることが出来なかった。しかし、攻撃の間ずっとサーバのリソースを無駄に使い続けられたと考えると100%こちらの勝利とも言いがたい。こういったケースでのリソースの消費について考えてみた。
NP_ProtectByMD5ではPostAuthenticationイベントでスパムチェックを行っている。このイベントはプラグイン用のイベントの中では一番最初に発生するものなので、その意味ではもっともリソースの消費が少ないといえる。
それでも、globalfunctions.phpの中で
が実行されており、少なくとも4つの大きなクラスのソース読み込みと、オブジェクトの作成がなされている。ここで消費されるリソースの量は、無視できるほどではないはず。
一方、NP_ProtectByMD5内でのスパムチェックルーチンはNP_ProtectByMD5::_checkHash()関数で、内容は以下の通りである。
要するに、
1)スパムチェックをするかどうかの確認
2)チェックするアクションの確認
3)MD5値のチェック
を行っているわけであるが、これと同じ事を最小限のコードで記述することが出来れば、最小限のリソース消費でスパムを『軽くあしらう』ことが出来るはずだ。例えば、以下のコードをindex.phpの冒頭に記述してみたら、どうなるだろうか。
やっていることは同じである。
1)スパムチェックをするかどうかの確認→このコードを挿入するかどうか
2)チェックするアクションの確認→if ($_POST['action']=='addcomment')
3)MD5値のチェック→if ($_POST['np_protectbymd5_hash']!=md5($_POST['np_protectbymd5']))
うまく行くかな?
(追記)
もしかしたら、次の記述のほうがより有効かもしれない。
スパムロボットが 404 Not Found に出会ったときに次の攻撃をあきらめることを期待している。ただし、一部のスパムロボットはIP詐称でアクセスしている気配があるので、その場合はこの変更はあまり意味が無いけれど。
結果としてはすべてブロックしたので、スパム業者は勝利を収めることが出来なかった。しかし、攻撃の間ずっとサーバのリソースを無駄に使い続けられたと考えると100%こちらの勝利とも言いがたい。こういったケースでのリソースの消費について考えてみた。
NP_ProtectByMD5ではPostAuthenticationイベントでスパムチェックを行っている。このイベントはプラグイン用のイベントの中では一番最初に発生するものなので、その意味ではもっともリソースの消費が少ないといえる。
それでも、globalfunctions.phpの中で
include($DIR_LIBS . 'MEMBER.php'); include($DIR_LIBS . 'ACTIONLOG.php'); include($DIR_LIBS . 'MANAGER.php'); include($DIR_LIBS . 'PLUGIN.php');
が実行されており、少なくとも4つの大きなクラスのソース読み込みと、オブジェクトの作成がなされている。ここで消費されるリソースの量は、無視できるほどではないはず。
一方、NP_ProtectByMD5内でのスパムチェックルーチンはNP_ProtectByMD5::_checkHash()関数で、内容は以下の通りである。
if ($this->getOption('usethis')!='yes') return true; if (!($action=requestVar('action'))) return true; $actions=' '.preg_replace('[\s]',' ',$this->getOption('actions')).' '; if (!strstr($actions," $action ")) return true; if (postVar("np_protectbymd5_hash")==md5(postVar("np_protectbymd5"))) return true; return false;
要するに、
1)スパムチェックをするかどうかの確認
2)チェックするアクションの確認
3)MD5値のチェック
を行っているわけであるが、これと同じ事を最小限のコードで記述することが出来れば、最小限のリソース消費でスパムを『軽くあしらう』ことが出来るはずだ。例えば、以下のコードをindex.phpの冒頭に記述してみたら、どうなるだろうか。
if ($_POST['action']=='addcomment') { if ($_POST['np_protectbymd5_hash']!=md5($_POST['np_protectbymd5'])) exit('<html><body>Sorry</body></html>'); }
やっていることは同じである。
1)スパムチェックをするかどうかの確認→このコードを挿入するかどうか
2)チェックするアクションの確認→if ($_POST['action']=='addcomment')
3)MD5値のチェック→if ($_POST['np_protectbymd5_hash']!=md5($_POST['np_protectbymd5']))
うまく行くかな?
(追記)
もしかしたら、次の記述のほうがより有効かもしれない。
if ($_POST['action']=='addcomment') { if ($_POST['np_protectbymd5_hash']!=md5($_POST['np_protectbymd5'])) { header("HTTP/1.0 404 Not Found"); exit(''); } }
スパムロボットが 404 Not Found に出会ったときに次の攻撃をあきらめることを期待している。ただし、一部のスパムロボットはIP詐称でアクセスしている気配があるので、その場合はこの変更はあまり意味が無いけれど。