最近連続投稿(同時投稿)の書き込みが増えてきて
対策をしたいと思っています。
掲示板の仕組みはフォームへ入力された内容を
データベースへinsertしています。
対策として、insertをする前に最近のレコードに同じ内容が
ないかチェックしてあった場合は書き込みをしないという風に
しています。
自分で試す分にはこの対策は有効のようなのですが
どうやっているのか、この方法を掻い潜って連続投稿を
している人がいるのです。
しかも、投稿日時を見ると全く同じ時間、同じ内容で数件の
書き込みがなされています。
書き込み内容からすると、偶然このようなことがおきているというより
特定のユーザーが意図的にやっている様に思われます。
こちらで再現が出来ないので対策が出来なくて困っています。
掲示板を荒らす人特有のやり方やツールなどがあるのでしょうか?
有効な対策はあるでしょうか?
対策として、insertをする前に最近のレコードに同じ内容が
ないかチェックして
ってことは、完全同時にアクセスすればわずかなタイミングだけど INSERT される前に同じデータがないとチェックを通ってしまう可能性があるわけですね。
DBの種類によりますが、その部分だけごく簡単に対策するなら TABLE ロックをかけてチェックする時間をずらしてやるという方法がとれます。
また、同時に同内容ということであれば、F5 キー連打も含めごく簡単にツールを作れます。
入力画面で Cookie を発行し、投稿画面で事前に発行した Cookie がないと投稿できないなどの仕組みが考えられます。
もっとも、こうした対策はいたちごっこになるのは見えているので出来ればスパム対策機能をもった掲示板への乗り換えをお勧めしますが。
その仕組みですと、同時に複数のページを立ち上げて同時に書き込まれたら連投できてしまうのではないでしょうか。(書き込みテスト・プロセスを作って、同時に複数走らせてみてください)
Cookieで連投を防ぐ方法もありますが、異なるブラウザやPCからの連投を防ぐことはできません。
あとは、同一IPアドレスによる連投をチェックするか――これだと、社内からアクセスしている人には不便をかけることになってしまいます。
b-wind さんがアドバイスしているように、DBのキューを1本に絞ってTABLEにロックをかけるのが緊急避難的対応でしょう。
また、そういう連投行為をする人のIPは限定的でしょうから、そのIPをアクセス禁止にするなどが有効と思われます。
> これって具体的にはどのようにすればいいのでしょうか?
あまり具体的に書いてしまうと、攻撃者を利するような気がしますので‥‥
PHPをご利用のようですので、「PHP マルチスレッド」でググってみてください。関連情報が出てきます。
ありがとうございます。
いろいろ調べて見ます。
>(書き込みテスト・プロセスを作って、同時に複数走らせてみてください)
これって具体的にはどのようにすればいいのでしょうか?