まず、スパム対策の概念について説明します。2 か月前、父の会社の Web サイトで問題に直面しました。連絡フォームがありますが、ロシアのボットがサーバーのメールボックスに頻繁にスパムを送信し始めました (1 日に 3 ~ 5 件のメッセージ)。キャプチャを改善しました (より複雑なフォント、別の背景など) が、それは恒久的な解決策ではないようです。ボットは思ったより少し賢かった。私はさまざまなスパム対策の概念を読み始め、「ハニーポット法」を見つけました。しばらくは機能しましたが、ボットは実装後最初の 1 週間でフィールドの名前を学習しました。今では、毎朝 PHP ファイルを開いて、隠しフィールドの新しい名前を考えなければなりません。
わかった。質問に。そのフィールドのランダムな名前を生成する必要がありますが、それを行う方法の概念が必要です。現在、次の処理を行う PHP スクリプトを使用しています。
1: MySQL DB に記録された、10 分以上経過したすべてのセッションを削除します。
2: 現在のユーザーにセッションが設定されているかどうかを確認します。
3: セッションが設定されてから 10 分以内の場合、セッションを更新し、現在の出力をtime()
データベースに書き込みます。
4: そうでない場合 - 新しいセッションを開始し、それsession_id()
を MySQL に記録します。
MySQL テーブルに 4 つの列があります: id(PRIMARY KEY、レコードの ID); sess_id(出力を入れてsession_id()
、ユーザーのセッションを管理するために使用する場所); session_started (の出力を含むtime()
); tf_name (ランダムに生成された文字列を含み、後でハニーポット フィールドの名前属性として使用する必要があります)。
一般に、この概念は機能します。ただし、ユーザーは、ページが読み込まれてから 10 分以内にメッセージを送信するように制限されています。時間要素を排除する必要があります。
私の意見では、解決策の 1 つは、サイトの読み込み時に新しい PHP セッションを生成しsession_destroy()
、ユーザーが Web サイトを離れたとき (ブラウザーを閉じる、外部リンクをクリックするなど) に新しい PHP セッションを生成することです。しかし、これを実装するのは難しいようです。 JavaScript を使用したくない (したがって、onunload イベントを使用できない) という事実と、外部リンクまたは内部リンクをクリックしても (または、ハニーポット フィールドの新しい名前が生成されます)。