導入
Webアプリケーションにおいて、掲示板や問い合わせフォームへのスパム投稿や、意図しない連続クリックによる多重送信は悩みの種です。これらを完全に防ぐにはログイン認証やCAPTCHAの導入が不可欠ですが、少しの手間で「いたずら投稿」のハードルを上げたい場合に有効なのが、クッキーを利用した簡易的な連続投稿制限です。今回は、PHPで実装する最も基本的かつ軽量なロック手法を解説します。
基礎知識
PHPの setcookie() 関数は、ブラウザ側に小さなデータを保存する機能です。この仕組みを応用し、「投稿成功時にクッキーを保存し、そのクッキーが存在する間は投稿を受け付けない」というフラグを立てることで、連続投稿を制御します。ただし、クッキーはユーザー側で削除や無効化が可能であるため、あくまで「悪意のない誤操作防止」や「低レベルなスパム対策」としての用途に留めてください。
実装/解決策
実装の肝は、投稿処理の直前にクッキーの存在を確認することです。また、CSRF対策用のチケットと組み合わせることで、より安全なフローを構築できます。具体的には、以下の手順で実装します。
1. フォーム表示時に認証チケットを発行。
2. 投稿処理時にチケットの整合性を確認。
3. 制限用クッキーの有無を確認し、あればエラーを返す。
4. 投稿成功後に一定時間有効な制限クッキーを発行。
サンプルプログラム
以下のコードは、投稿後に5分間の制限を設ける実装例です。
応用・注意点
注意点: クッキーのみの制限は、ブラウザをシークレットモードに切り替えたり、クッキーを削除したりすることで容易に回避されます。より強固な制限が必要な場合は、以下の対策を組み合わせるのが実務の定石です。
・IPアドレス制限: $_SERVER[‘REMOTE_ADDR’] を取得し、DBやキャッシュサーバー(Redis等)に投稿時間を記録します。
・セッション管理: クッキーよりもサーバー側で管理できるセッションを利用する方が、ユーザーによる改ざんを防ぎやすいです。
・CAPTCHAの併用: Google reCAPTCHAなどを導入することで、BOTによる自動投稿を高い精度で遮断できます。
現場では、単一の手法に頼らず、これらを組み合わせて「多層的な防御」を行うことが推奨されます。まずはクッキーによる制御を理解し、要件に合わせてセキュリティレベルを段階的に引き上げていきましょう。