2012-10-31 2 views
6

저는 몇 달 동안이 PHP 웹 애플리케이션을 개발했습니다. 갑자기 사용자 중 한 명이 로그인 할 수 있다고 불평했지만 어떤 버튼을 클릭하자마자 세션이 종료되었습니다! 같은 문제가 여러 브라우저에서 발생했습니다.클라이언트의 시계가 미래에 설정되면 PHP 세션이 즉시 만료됩니다.

몇 가지 테스트를 한 후 원래 세션이 만료 되었기 때문에 사용자가 아무 버튼이나 클릭 할 때마다 새로운 세션 ID가 생성되었음을 알았습니다.

나는 사용자의 컴퓨터 시계를 흘끗보고 어떤 이유에서든 ... 놀랍습니다! 그의 시계는 앞으로 3 개월이되었습니다! 그런 일이 실패와 어떤 관련이 있는지 나는 몰랐다. 그러나 나는 시계를 고쳤다. 아직도 그것은 작동하지 않았다. 나는 모든 쿠키를 지웠다. 아직 아무것도. 그래서 브라우저를 다시 시작한 다음 다시 작동하기 시작했습니다.

내가이 문제에 관해 가장 가까운 정보는 this question에 대한 Shimon Amit의 답변이었습니다. 좋아, 이제는 시계의 "잘못된 설정"이 원인이라는 것을 알고 있습니다. 문제는 ... 모든 고객의 컴퓨터 시계를 제어 할 수는 없습니다. 그들 중 일부는 미래에 컴퓨터 시계를 설정할 수 있습니다.

내 질문 : 거기에 어떤 해결책이 있습니까? 어떤 속임수? 나는 고객이 "절름발이"라는 오류를 발견하고 응용 프로그램에 대한 신뢰를 깨뜨리는 것을 원하지 않습니다. 실제로는 내 잘못이 아닙니다.

+7

사용자의 시계가 상대적으로 정확할 것이라고 기대하는 것은 무리라고 생각하지 않습니다. 어쩌면 두 번째로 내려 가지 않을 수도 있지만, 3 개월은 우스꽝 스럽습니다. 하지만 과거 20 년 동안의 견과가 아닙니다. –

+0

전적으로 동의합니다. 불행히도 응용 프로그램이 작동을 멈 추면 사용자는 나를 비난 할 것이고 결국에는 실패를 분석하는 데 시간을 낭비해야 할 것입니다. 먼 미래에 발생하면이 "버그"를 잊어 버렸을 것입니다. 그래서 저는 실제로 진정한 해결책을 찾고있는 것이 아니라, 어플리 케이션을 어리석게 만드는 것을 시도하고 있습니다. – Bizarro

답변

2

세션 시간 초과를 나중에 연장 할 수 있습니다. 아마도 만료되지 않는 쿠키를 사용할 수 있습니다 (세션은 클라이언트 측 쿠키와 관련이 있습니다). 그렇지 않으면 클라이언트의 브라우저가 의도 한대로 작동하고 있습니다.

편집 : 자바 스크립트 옵션

이 총 해킹,하지만 당신은, 당신의 세션 쿠키에 제한 시간을 조정 클라이언트 시스템의 현재 시간을 얻을 서버로 다시 보내 자바 스크립트를 사용할 수 그 후 3 개월 후에 만료됩니다. http://www.w3schools.com/jsref/jsref_gettime.asp

클라이언트 시간을 검색하면 session_cache_expire()를 사용하여 세션 만료를 재설정 할 수 있습니다. http://www.php.net/manual/en/function.session-cache-expire.php

편집 : 100 % 서버 측 옵션

나는 만기와 세션 쿠키를 설정하지만, 쿠키가 서버에 설정 한 시간을 추적하는 것입니다 생각하는 또 다른 옵션 A의 말 MySQL 테이블. 또한 마지막 활동을 추적해야합니다. 로그인 한 사용자가 요청할 때마다 세션 시작 시간과 마지막 활동을 확인할 수 있습니다. 현재 시간이이 중 하나에 대한 허용 시간 초과보다 크면 세션 서버 측을 제거하고 다시 로그인 페이지로 가져 오십시오. 세션이 여전히 괜찮 으면 다음 요청시 비교할 수 있도록 해당 사용자와 관련된 마지막 활동을 업데이트하십시오. 클라이언트 측 코드가 필요 없습니다.

+0

OK ... 그래서 Sammitch와 같은 질문을 할 것입니다 : javascript없이 브라우저의 날짜를 잡을 수있는 방법이 있습니까? – Bizarro

+0

저는 비 자바 스크립트 솔루션을 인식하지 못합니다. 지난 30 분 동안 웹에서 검색 한 결과 아무 것도 찾을 수 없었습니다. 비 만료 쿠키를 사용하여 서버 측에서 처리 할 수 ​​있다고 생각합니다. 내 대답을 편집하고 설명하겠습니다. –

+0

@Bizarro 문제에 대한 전체 서버 측 솔루션을 추가하기 위해 필자의 답을 수정했습니다. 감사! 이것은 나를 생각하게했다! :) –

-1

세션 제한 시간을 비활성화하거나 적어도 먼 미래에 설정하십시오. 그 트릭을해야합니다.

5

세션 쿠키 (모든 쿠키와 마찬가지로)는 클라이언트 브라우저에서 만료되면 제어되고 삭제됩니다. 아무리해도 원하지 않을 만료 날짜를 멀리 설정했다고해도 클라이언트가해야 할 일은 시계를 앞으로 더 멀리 이동하면 만료됩니다.

1

트릭이 있습니까?

세션 쿠키를 사용하십시오. PHP 세션의 의미는 세션이 아니라 브라우저 세션입니다. Session cookies은 사용자가 브라우저를 닫을 때까지 저장됩니다. 사용자가 컴퓨터를 설정 한 시간에는 영향을받지 않습니다. 그들은 브라우저가 닫힐 때까지 지속됩니다.

일반적으로 PHP 세션 관련 쿠키에 적합합니다.

PHP의 경우 세션 쿠키 매개 변수 의 수명이이되도록 설정해야합니다. 세션을 시작하기 전에 0으로 설정해야합니다. 그것은 ini 설정 session.cookie_lifetime이거나 session_set_cookie_params 함수 호출입니다.

쿠키 매개 변수에 대한 자세한 내용은 setcookie 기능 설명서를 참조하십시오.

트릭의 두 번째 부분은 세션 시작 타임 스탬프와 마지막 활동 타임 스탬프를 PHP $_SESSION에 삽입하는 것입니다. 그것들은 서버 기반이므로 항상 같은 기반을 가지고 있습니다.

예를 들어 확인하십시오. 세션이 너무 오래되었거나 너무 오래 전에 활동 한 경우 세션을 파괴하고 사용자가 다시 로그인하도록하십시오.

트릭의 두 번째 부분을 사용하여 향후 10 년 후에 만료 될 쿠키를 조합 할 수도 있습니다 (예 : 브라우저가 과 같지 않음,, 3 개월 만 필요할 수도 있음).

+0

세션 지식이 매우 열악하다고 고백해야합니다. 나는 당신의 포스트를 신중하게 연구해야하지만, 이미이 솔루션은 내 자신의 접근 방식보다 더 "깨끗한"(또는 "정확한") 것처럼 보일 수 있습니다. 유일한 개인적인 단점은 응용 프로그램의 일부를 다시 작성해야한다는 것입니다. 시간이 오래 걸립니다. – Bizarro

+0

첫 부분은 실제로 PHP 구성입니다 (기본값은 0). 두 번째 부분은 추가이지만 일반적으로 세션이 영원히 지속되지 않는 것이 좋습니다. 따라서이 시간을 추적하면 문제를 해결할뿐만 아니라 일정 시간 비 활동 또는 일반 세션 시간이 지나면 세션을 종료 할 수 있습니다. 보안상의 이유로 사용자는 다시 로그인해야합니다. – hakre

2

@ MarcB의 의견에 동의하는 것은 사용자의 컴퓨터가 어떻게 잘못 구성되었는지에 대해 책임을지지 않는다는 사실입니다. 이 점에 정말로 차이를 만들고 싶다면 PHP를 사용하여 서버의 시간을 포함하는 작은 자바 스크립트를 출력하는 것이 좋습니다. 스 니펫은 클라이언트 컴퓨터에서 해당 시간을 시간과 비교하여 시간이 서버에서 X 이상 차이가 나는 경우 경고를 발생시킵니다. [예 : 24 시간 정도]

+0

나는 그것을 좋아한다. 유일한 요점은 : 나는 자바 스크립트와 함께 또는 자바 스크립트없이 작동하는 방식으로 애플리케이션을 개발하려고하고있다. 서버 측에서 동일한 검사를 수행하는 방법이 있습니까, 아마도 브라우저의 날짜를 얻는 것입니까? 전혀 가능합니까? – Bizarro

+0

브라우저가 HTTP 요청으로 타임 스탬프를 보내지 않는다는 것을 알고있는 한, 클라이언트 PC에 설정된 시간을 확인하는 유일한 방법은 클라이언트 측 코드의 일부 양식 (예 : JavaScript) 일 것입니다. 진심으로 그래도, 나는 이것조차 신경 쓰지 않을 것이다. 클라이언트의 시계가 5 분/2 시간/24 시간 이상으로 벗어난다면 단 하나의 웹 사이트 이상으로 많은 문제가 발생할 것입니다. – Sammitch

+0

나는 약간 연구를했고 $ _SERVER [ 'REQUEST_TIME'] 변수를 발견했습니다. 제대로 작동하는 것 같아서 $ _SERVER [ 'REQUEST_TIME']과 서버 시간 사이에 날짜 비교를 포함합니다. 차이가 30 분보다 크면 사용자는 로그인 할 수 없습니다. 예, 저는 급진적입니다 :-) – Bizarro

관련 문제