クライアントから返されたデータを完全に信頼することはできないため、サーバーは、最初に生成されたフォームのタイムスタンプが何であったかを何らかの方法で知る必要があります。これは、セッションまたはデータベースに変数を保存することで実行できますが、これには問題があります。代わりに、サーバーは、クライアントが変更していないことを確認するために、暗号化または署名された形式でタイムスタンプを配置できます。その後、サーバーは必要に応じて送信を拒否できます。クライアントでは、個別のロジックが UI 部分を処理し、ユーザーに制限時間に関するフィードバックを提供できますが、最終的には、これはサーバー処理と疎結合になっているだけです。
詳細:
サーバーは 2 つのフォーム フィールドを生成する必要があります。1 つtime = Time.now.to_i
はフォームがいつ生成されたかを追跡するためのシステム タイムスタンプを持ち、もう 1 つは署名を持ちますDigest::MD5.hexdigest(time.to_s.concat('Some-secret-string-1234'))
(ここでは、タイムスタンプ フォーム フィールドと署名フォーム フィールドに同じ時間値を使用していることに注意してください)。これは、クライアントによって変更されていないサーバー生成のタイムスタンプでフォームが送信されたことを検証します。
制限時間のある別のフォーム フィールドを送信することもできます。
クライアントでは、タイムスタンプを読み取り、setTimeout と時間制限を使用してカウントダウンを生成するか、フロント エンドで実行したいことを行います。
フォームが送信されたら、以前と同じ方法を使用して MD5 署名を再生成することにより、フォームで送信されたタイムスタンプを認証します。フォームから送信された署名と一致していることを確認してください。次に、タイムスタンプをタイムアウトに追加し、現在のサーバー時間よりも遅いことを確認します。もしそうなら、あなたの時間制限内で、あなたは有効な提出物を持っています。
ネットワークの遅延を考慮して、サーバーでのタイムアウトにはクライアントでのタイムアウトよりも少し余裕を持たせる必要があります。おそらく数秒です。サーバー要求が受信されると、タイマーが切れたように見えます。
require 'digest/md5'
MD5 にアクセスするには、必ず追加してください。
このように MD5 署名を使用することは、クライアントがフォームのキー パラメータをステートレスな方法で変更していないことを確認する優れた方法です。トリックのバッグに加えるのに最適です。
幸運を!