2011-04-20 5 views
0

이것은 이상한 버그이며, 무슨 일이 일어나고 있는지 파악하는 방법조차 모릅니다.신속하게 브라우저 뒤로 버튼을 두 번 클릭하면 사용자가 케이크 앱에 로그 아웃됩니다.

우리는 데이터베이스에서 세션과 함께 Cake 1.3.8을 사용하고 있습니다. ACL이나 기타 액세스 제어를 사용하지 않습니다. 우리가 응용 프로그램을 탐색하고 조금 클릭 한 다음 브라우저 뒤로 버튼을 두 번 클릭하면 (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 공격에 의한 세션 도용을 방지하기 위해 세션 쿠키가 http_only로 설정되도록 코어를 해킹하는 것이 좋습니다. Cakephp 1.x는 PHP4를 지원하므로 기본값으로 설정하지 않을 것입니다.

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

+0

나는 속였지만 실제로 이것은 문제였다. 나는 cake_sessions.php를 변경하여 결국 브라우저가 닫을 때 세션이 끝나는 세션을 모든 수준의 보안에 제공했다. 그런 다음 보안 수준을 보통으로 설정했습니다. 뒤로 단추는 더 이상 사용자를 기록하지 않습니다. –

0

유일한 것은 다시 페이지를 갈 때 너무 빨리 당신의 코드를 검증 할 수 없다는 것입니다 사람이 충분히 빠르게 (신임장 확인에서 왕복),로드 된 다음 페이지 (두 번째 백업 된 페이지)에 표시되는 오류를 던집니다.

사용자가 실제로 로그 아웃되었거나 오류가 발생 했습니까?

코드를 보지 않고는 더 이상 못 박는 것이 어렵습니다.

+0

사람이 확실히 로그 아웃되었습니다. 다른 페이지로 이동하면 로그인 버튼이 표시됩니다. –

1

세션이 지워졌을 수 있으며 다시 쓸 수 있기 전에 뒤로 버튼을 클릭하면 세션 변수에서 인증이 제거됩니다.

페이지로드 -> 뒤로 버튼 클릭 -> 세션이 지워지지만 세션이 다시 작성되기 전에 -> 뒤로 버튼 클릭 -> 세션에서 기존 세션을 확인하지 않습니다.

+0

그것은 훌륭한 생각입니다. 자, 질문은 어떻게됩니까? 코드를 파고 가서 업데이트가 아닌 삭제하고 삽입하는지 확인하려고합니다. –

+0

beforeFilter()에 pr ($ this-> Session)을 추가해보십시오. 몇 페이지를 탐색 한 다음 뒤로 버튼을 몇 번 누르십시오. 이전 페이지로 돌아가서 세션이 이전과 동일하게 보이는지 확인하십시오. –