Webページは、HTTP POST要求内でユーザー名とパスワードのデータを受け入れます。このPOSTリクエストは、実際にはブラウザの履歴のエントリとして表示されます。ユーザーがアプリケーションからログアウトし、「戻る」ボタンを使用してこのエントリに「ナビゲート」すると、ブラウザはコンテンツがすでに期限切れであることを認識し、コンテンツの期限が切れているという情報と、「更新された」バージョンを取得するリクエストを再送信するように求めますサーバーからそのページの。
ユーザーが再試行/更新ボタンをクリックすると、このフォームデータがサーバーに返され、通常のログインリクエストとして扱われます。これにより、ユーザーは以前にログアウトしたユーザーのキャッシュされた資格情報を使用してアプリケーションにログインできます。入力要求データのキャッシュを防ぐために可能な方法は何ですか?
それは決して起こらないはずです。
確認できるコードサンプルがない場合、以下に示す認証ワークフローが原因であると想定できる理由の1つ:
次の図では、/login
が/member
にPOSTし、認証チェックが行われます。
認証に成功した場合、ページは引き続き「ログインしたユーザー」のコンテンツを送信します。これにより、このページ(/member
)がブラウザの履歴に表示されます。ブラウザの[戻る/進む]ボタンをクリックしてこのページにアクセスすると、POSTこのページのフォームのコンテンツを表示するかどうかを尋ねられます。この場合、日付はログイン資格情報です。
間違った方法: + -------------------------- -+ + ------------------------------ + |ログインページ(/ login)| |メンバーページ(/メンバー)| | ------------------------ ------------------------------ | | + -------------- + | |クレジットが間違っている場合| |ユーザー名| | | | redirect_to/login | | + -------------- + | + --------> |その他| | + -------------- + | | "おかえりなさい、| |パスワード| | | |これがあなたの極秘です| | + -------------- + | |あなたがいるメンバーエリアできます| | | |クールなものをチェックしてください "| + --------------------------- + |終了| + ------------------------------ +
代わりに、次の種類の認証フローが必要です。
/verify
(または/ auth
という名前の)ページに投稿します。/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」に設定できます。
キャッシュ制御:キャッシュなし