あなたの質問は、「どうすれば AJAX と非 AJAX を区別できますか?」ということではありません。それは、「誰かがクリックを繰り返したり、投票用紙を詰め込んだりして、スコアを水増しするのをどのように止めればよいでしょうか?」ということです。
あなたが尋ねた質問への答えとして、あなたが引用した答えは本質的に正しかった. 要求が AJAX、特定のブラウザー、CURL セッション、または生の HTTP コマンドを telnet セッションに入力している人によるものかどうかを判断する信頼できる方法はありません。ブラウザー、スクリプト、またはアプリが表示される場合がありますが、PHP が表示するのは次のすべてです。
GET /resource.html HTTP/1.1
host:www.example.com
リクエストが AJAX であるかどうかを知りたい便利な理由がある場合、jQuery などの一部の JavaScript ライブラリは、検索できる追加の HTTP ヘッダーを AJAX リクエストに追加するか、手動でヘッダーを追加するか、ペイロードにフィールドを含めることができます。 AJAX=1 として。次に、それらのサーバー側を確認し、AJAX 要求に対して実行する必要があると思われるアクションを実行できます。
もちろん、CURL を使用して正しいヘッダーを設定した同じ要求を作成し、サーバーに AJAX 要求であると認識させることを妨げるものは何もありません。したがって、リクエストが AJAX であるかどうかに関心がある場合にのみ、そのようなトリックを使用して、応答を適切にフォーマットできるようにする必要があります (AJAX でない場合は HTML ページを送信し、AJAX の場合は JSON を送信します)。アプリケーションのセキュリティは、そのようなトリックに依存することはできません。アプリケーションの設計で、セキュリティまたは信頼性の理由から AJAX と非 AJAX を区別する機能が必要な場合は、アプリケーションの設計を再考する必要があります。
実際に達成しようとしていることに対する答えとして、いくつかのアプローチがあります。ただし、完全に信頼できるものはありません。最初のアプローチは、最初のクリックでユーザーのマシンに Cookie を置き、その後の要求に Cookie がある場合、そのユーザー エージェントからの後続の要求を無視することです。これは非常に単純で軽量なアプローチですが、単に Cookie を削除するか、そもそも Cookie の受け入れを拒否するだけで、簡単に破ることができます。
または、ユーザーが AJAX リクエストを行ったときに、クリックが送信されたという事実とともに、リクエストしているユーザー エージェントに関する情報を記録できます。たとえば、クリックのタイムスタンプとともに、クライアントの IP とユーザー エージェント文字列のハッシュ (MD5 より強力なもので保存されます!) を保存できます。密接にグループ化されたタイムスタンプとともに、同じハッシュが多数表示される場合は、悪用が試みられている可能性があります。繰り返しますが、このトリックは 100% 信頼できるわけではありません。ユーザー エージェントはユーザー エージェント文字列として必要な任意の文字列を見ることができるからです。