web-dev-qa-db-ja.com

フォームデータのキャッシュを無効にする方法は?

Webページは、HTTP POST要求内でユーザー名とパスワードのデータを受け入れます。このPOSTリクエストは、実際にはブラウザの履歴のエントリとして表示されます。ユーザーがアプリケーションからログアウトし、「戻る」ボタンを使用してこのエントリに「ナビゲート」すると、ブラウザはコンテンツがすでに期限切れであることを認識し、コンテンツの期限が切れているという情報と、「更新された」バージョンを取得するリクエストを再送信するように求めますサーバーからそのページの。

ユーザーが再試行/更新ボタンをクリックすると、このフォームデータがサーバーに返され、通常のログインリクエストとして扱われます。これにより、ユーザーは以前にログアウトしたユーザーのキャッシュされた資格情報を使用してアプリケーションにログインできます。入力要求データのキャッシュを防ぐために可能な方法は何ですか?

5
wxyz

それは決して起こらないはずです。
確認できるコードサンプルがない場合、以下に示す認証ワークフローが原因であると想定できる理由の1つ:

次の図では、/login/memberにPOSTし、認証チェックが行われます。

認証に成功した場合、ページは引き続き「ログインしたユーザー」のコンテンツを送信します。これにより、このページ(/member)がブラウザの履歴に表示されます。ブラウザの[戻る/進む]ボタンをクリックしてこのページにアクセスすると、POSTこのページのフォームのコンテンツを表示するかどうかを尋ねられます。この場合、日付はログイン資格情報です。

 
間違った方法:
 
 + -------------------------- -+ + ------------------------------ + 
 |ログインページ(/ login)| |メンバーページ(/メンバー)| 
 | ------------------------ ------------------------------ | 
 | + -------------- + | |クレジットが間違っている場合| 
 |ユーザー名| | | | redirect_to/login | 
 | + -------------- + | + --------> |その他| 
 | + -------------- + | | "おかえりなさい、| 
 |パスワード| | | |これがあなたの極秘です| 
 | + -------------- + | |あなたがいるメンバーエリアできます| 
 | | |クールなものをチェックしてください "| 
 + --------------------------- + |終了| 
 + ------------------------------ + 

代わりに、次の種類の認証フローが必要です。

このワークフローでは、/verifyページがブラウザーの履歴に表示されることはなく、ユーザーがそのページを「クリックして更新」してPOSTデータが再度送信されるようにトリガーすることはできません。

正しい方法POST + ----------------------------- + 
 + ------------> |検証ページ(/ verify)| 
 | | ------------------ ----------- | 
 + ------------------------- +-+ |クレデンシャルが間違っている場合| 
 |ログインページ(/ login)| <--- + --------- + redirect_to/login | 
 | ----------- ---------------- | | | else | 
 | + -------------- + | | | set_session_cookie | 
 |ユーザー名| | | | + ------- + redirect_to/member | 
 | + ------------ ++ | | | | end | 
 | + -------------- + | | | | | 
 |パスワード| | | | | + ---------- ------------------- + 
 | + -------------- + | | | 
 | | | | +- ----------------------------- + 
 + -------------- ------------- + | + -----> |メンバーページ(/ member)| 
 | | ------------------------------ | 
 | | session_cookieが設定されていない場合| 
 + ----------- + redirect_to/login | 
 |その他| 
 | 「おかえりなさい、| 
 |これがあなたの極秘です| 
 |メンバーエリア| ​​
 |クールなものをチェックしてください| | 
 |終了| 
 + ------------------------------ +

これは一般的なPost/Redirect/Getモデルです。より美しい写真については、このWikiページを確認できます:---(http://en.wikipedia.org/wiki/Post/Redirect/Get

また、ブラウザが特定のHTMLページをキャッシュしないようにする場合は、それらのページのcache-control HTTPヘッダーを「no-cache」に設定できます。

キャッシュ制御:キャッシュなし

5
CodeExpress