2013-08-20 2 views
0

작은 CMS 작성. 사용자 인증은 명명 된 세션에서 php로 설정된 세션 변수를 기준으로합니다. 로그 아웃이 호출되면, Ajax 루틴은 작업을 수행하는 별도의 PHP 스크립트를로드합니다. 이 별도의 스크립트는 동일한 세션 매개 변수를 사용합니다. 세션 변수는 무작위 데이터로 개별적으로 덮어 쓰여지고 세션은 파괴됩니다. 이 작동합니다. 로그 아웃 한 후 브라우저 쿠키 목록을 검사하면 세션 쿠키가 제거되었음을 알 수 있습니다. 지금까지 모두 괜찮 았어.웹 사이트에서 사용자를 로깅하는 데 어려움이 있습니다.

사용자가 로그온하는 동안 동일한 사이트의 다른 페이지로 이동하거나 새 브라우저 탭에서 두 번째 페이지를 열면 문제가 발생합니다. 둘 중 하나가 완료되면 로그 아웃 루틴은 세션을 삭제하거나 설정을 해제 할 수 없습니다. 더욱이 암호 세션 변수가 로그 아웃 할 때 임의로 지정 되더라도 페이지를 다시로드하면 이전 값으로 복원되므로 효과적으로 사용자를 다시 로그인 할 수 있습니다.

브라우저 데이터를 검사하면 session_destroy()가 실행될 때 세션 쿠키를 삭제하지 못했음을 보여줍니다. 프로그래밍 방식으로 처리 할 수있는 방법은 없습니다.

동일한 세션 매개 변수를 사용하는 두 번째 사이트 페이지를 여는 것이 겉으로보기에는 세션을 잠궈서 어느 페이지에서나 삭제할 수없는 이유를 알아 내려고하고 있습니다. 아무데도 php 매뉴얼에서 그런 행동을 제안하지 않습니다.

브라우저 캐시가 가능한 원인으로 제안되었지만 가능성이 희박합니다.

얼마 동안이 문제가 해결되었습니다. 어떤 아이디어?

테스트가 Firefox, 버전 6 이상에서 완료되었습니다.

+0

세션 변수에 암호를 넣지 마십시오. – developerwjk

+0

[session_destroy() 문서] (http://php.net/session_destroy)를 읽으면 세션 쿠키를 제거하지 않음을 분명히 알 수 있습니다. setcookie() 호출로 설정을 해제해야합니다. 세션을 "죽이기"위해서 정말로 필요한 것은'$ _SESSION = array(); session_write_close()'. 빈 세션을 디스크에 강제로 적용하고 사용자는 효과적으로 잊어 버리고 로그 아웃됩니다. –

답변

0

session_destroy() 세션 쿠키를 설정 해제하지 않았거나 해당 문제에 대해 $_SESSION 글로벌 변수를 재설정하지 않았습니다. 서버 측 세션 데이터 저장소 (파일 기반 세션 구성의 기본 파일) 만 파괴합니다. 쿠키를 제거하는 것은 (세션 값을 없애기 위해 setcookie()을 사용하여 "수동으로"수행 할 수 있음) 필요하지 않습니다. session_destroy()가 호출되지 않고 쿠키는 동일한 ID새로운 세션을 시작하는 후속 요청에 session_start()를 사용하여, 그대로 유지됩니다 (당신은 또한 session_regenerate_id()를 호출하지 않는 한)하지만 아무 세션 데이터를합니다.

이제 당신의 문제에 대한,이 코드를 보지 않고 무슨 일이 일어나고 있는지 말을 정말 열심히하지만 여기에 생각의 부부의 : 세션 변수는 임의의 데이터, 과 개별적으로 오버 기록 된

세션이 파괴됩니다.

session_destroy()을 호출하기 전에 세션 데이터를 세션 데이터 저장소에 설정하지 않으므로이 값을 설정하지 않아도됩니다.

로그 아웃 후 브라우저 쿠키 목록을 검사하면 세션 쿠키가 제거되었음을 알 수 있습니다.

내가 말했듯이 쿠키는 자동으로 제거되지 않습니다. 그것은 설정되지 않을 가능성이 더 큽니다.암호 세션 변수가 로그 아웃에서 무작위로 된 경우에도

더 나쁜, 페이지를 새로 고침하면이는 session_destroy() 실제로 아무 것도 파괴하지 않는 제안 이전 값

에 복직. 이로 인해 로그 아웃 스크립트에서 세션을 초기화하려고 시도하기 전에 (session_start()) 세션을 초기화하지 않는다는 의심에 빠지게됩니다. 경고가 표시되지 않거나 스크립트가 AJAX를 통해 호출 되었기 때문에 표시되지 않는 PHP 경고가 표시됩니다.

또 다른 가능성은 로그 아웃 스크립트가 세션을 시작한 다음 완전히 파괴 할 가능성이 있지만 완전히 다른 것입니다. Firebug 또는 유사한 도구를 사용하여 AJAX 요청과 함께 세션 쿠키가 전송되는지 확인하십시오.

마지막으로 누군가가 이미 언급했듯이 세션 변수에 비밀번호를 저장해야하는 경우 전체 인증 메커니즘을 다시 생각해 볼 수는 있지만 완전히 다른 주제입니다.

+0

많은 문제가 여기에서 다뤄졌으며 모든 문제를 다룰 수있는 많은 글이 필요할 것입니다. 기본적으로이 메커니즘은 단일 페이지에 대해 완벽하게 작동하므로 세션 데이터를 설정하거나 제거하지 못하고 있음을 알 수 없습니다. 그것은 세션 데이터가 뱀파이어와 같은 존재를 취하는 두 번째 페이지가 열릴 때 (또는 후에)입니다. 이 후에는 js 또는 php 명령으로 세션 쿠키를 제거하려는 시도도 실패합니다. 암호는 일반 텍스트로 저장되지 않습니다 (BTW). 소금에 절인 해시예요. –

0

MarcB가 답변을했습니다. 세션을 파괴하기 전에 session_write_close()를 실행해야합니다.

이렇게하면 아약스 로그 아웃 루틴에서 모든 페이지에서 로그 아웃하면 모든 열린 페이지에 대한 사용자의 편집 권한이 삭제됩니다.

감사합니다.

관련 문제