2011-04-20 1 views
0

これは奇妙なバグで、何が起こっているのか把握する方法がわかりません。ブラウザバックボタンを2回すばやくクリックすると、ユーザはケーキアプリにログアウトされます

私たちはデータベース内のセッションでCake 1.3.8を使用しています。私はACLやその他のアクセス制御を使用していません。私たちがアプリケーションに入り込んで少しだけクリックして、ブラウザの戻るボタンを2回(FirefoxとChromeで試してみました)すばやくクリックすると、ユーザーは頻繁にログアウトされ、「あなたは権限がありませんその場所にアクセスする '。

これまでの検索では、ユーザーがログアウトしてから戻るボタンを使用した場合、ページをアクセス不能にしたいと思っていました。私が見ている問題に関しては何も報告されていません。

これはケーキの問題であるかどうか、誰かが知っているか、何がうまくいかないのかをデバッグすることについて考えていますか?

更新:問題のある箇所が見つかりました。誰かがブラウザを閉じるたびにセッションを閉じる必要があるので、私はセキュリティを高く設定しています。私はS3への大規模なバイナリアップロードを行うため、タイムアウトを非常に高く設定しています。アップロードまたはダウンロード中にユーザーがログアウトしないようにしてください。問題を引き起こしているcake_sessions.php内のコードの特定のブロックである:

$time = $this->read('Config.time'); 
       $this->write('Config.time', $this->sessionTime); 
       if (Configure::read('Security.level') === 'high') { 
        $check = $this->read('Config.timeout'); 

        $check -= 1; 
        $this->write('Config.timeout', $check); 

        if (time() > ($time - (Security::inactiveMins() * Configure::read('Session.timeout')) + 2) || $check < 1) { 

         $this->renew(); 
         $this->write('Config.timeout', 10); 
        } 
       } 
       $this->valid = true; 

答えて

1

これは、security = highのときにセッションIDがリクエスト間で再生成されるためです。出典:

http://book.cakephp.org/compare/44/CakePHP-Core-Configuration-Variables/cakephp/cakephp1x

あなたが唯一の同期要求のうちいずれかが必要、不足しているイメージのために言うと、あなたがセッションを失うことになります。ユーザーがリンクやボタンをダブルクリックしてセッションを無効にすることはできないため、一般的には実行できませんでした。

私は、セッションタイムアウトをかなり短く設定し、AJAXスクリプトを使用して定期的な間隔(たとえば60秒ごと)でセッションを更新することについて、中程度のセキュリティを使用することを考えます。こうすることで、タブ/ウィンドウが閉じられた場合、ユーザーはすぐにログアウトされます。

セキュリティが優先される場合、XSS攻撃によるセッションハイジャックを防ぐために、セッションCookieがhttp_onlyに設定されていることを確認するためにコアをハッキングすることをお勧めします。 Cakephp 1.xはPHP4をサポートしているので、デフォルトではこれを設定していない可能性があります。

http://php.net/manual/en/function.setcookie.php

+0

私はうんざりしましたが、これは実際に問題があったのです。私はcake_sessions.phpを変更して、ブラウザが閉じたときに終了するセッションを、あらゆるレベルのセキュリティに対して、私が望む動作にしました。次に、セキュリティレベルをmediumに設定しました。戻るボタンで人がログアウトしなくなりました。 –

0

私が考えることができる唯一のことが起こっているあなたはあまりにも速くページを戻っているときにあなたのコードが検証できないということです人はすぐに十分に速く(資格情報のチェックからの往復)、読み込まれた次のページ(2番目にバックアップされたページ)に表示されるエラーをスローします。

あなたは実際にログアウトしていると確信していますか、それとも単にエラーがスローされていますか?

コードが表示されていない場合は、これ以上釘付けするのは難しいでしょう。

+0

人は間違いなくログアウトされています。別のページに移動すると、ログインボタンが表示されます。 –

1

セッションが消去されている可能性があります。また、再度書き込む前に、セッション変数から認証を削除して戻るボタンをクリックします。

ページの読み込み - >戻るボタンクリック - >セッションは消去されますが(セッションが書き換えられる前に) - >戻るボタンのクリック - >セッションは既存のセッションをチェックしません。

+0

それは素晴らしい考えです。今、問題は、どうすればそれを防ぐことができますか?コードを掘り下げて、更新ではなく削除して挿入するかどうかを確認します。 –

+0

beforeFilter()でpr($ this-> Session)を追加してみてください。いくつかのページをナビゲートして、本当に数回後ろのボタンを押してください。あなたが元に戻ったページをチェックして、セッションが以前と同じように見えるかどうかを確認します。 –

関連する問題