2013-06-10 2 views
0

저는 PHP 기반 웹 응용 프로그램을 만들고 로그인 변수 기반 세션 변수를 구현했습니다. 아무 것도로드되기 전에이 메서드는 새 페이지를로드하거나 동일한 페이지를 다시로드하지 않고 사이트에 X 시간을 보낸 모든 사용자의 "로그인 상태"를 지 웁니다. 지금 이것은 위대한 일이지만 페이지가로드되고 마우스/키보드 활동을 찾지 못할 때만 검사를 수행합니다 (긴 양식이 채워지는 것을 생각하십시오).클라이언트 쪽 유휴 타이머를 사용하는 것이 얼마나 안전합니까/큰 웹 응용 프로그램 개발자는 어떻게합니까?

비슷한 질문이 있지만 here 코드의 보안 취약점에 대해서는 질문하지 않았습니다. 나는 또한 Paul Irish's solution to this 그러나 거기에 보안에 대한 참조를 찾지 못했습니다.

"절대 시간 초과"서버 측을 유지하는 경우 자바 스크립트 코드가 비활성화/가로 채기가 될 수 있다는 현실적인 두려움이 있습니까? 다른 대형 웹 응용 프로그램 디자이너는 어떻게합니까?

+4

왜 서버의 세션 수명 만 제한합니까? 클라이언트에서 JS를 그렇게 할 필요가 없습니다. – thejh

+0

아직 세션에 세션 시작 시간이 없으면 저장하십시오. 당신은 실제로 무엇을 성취하려고합니까? 사람들이 페이지 당 X 분 이상을 보내길 원하십니까? – halfer

+0

@thejh : 여전히 페이지로드가 필요하지 않습니까? 사용자가 페이지를로드하지 않고 입력 만하면 어떻게됩니까? – webeno

답변

2

여기에는 여러 가지 상호 관련 문제가 있습니다. 내 접근 방식은 완전히 서버 쪽에서 먼저 수행 할 수 있으며, 클라이언트 측 항목이 실행되지 않는 경우 문제가되지 않도록 자바 스크립트 기능이 추가되었습니다.

사용자가 로그온 할 때 솔루션의 핵심은 서버에 last_seen 시간을 설정하는 것입니다. 사용자 활동 (페이지 렌더링 또는 AJAX 응답)을 감지 할 때마다이 시간이 허용되는 범위 내에 있는지 그리고 현재 시간으로 덮어 쓰는지 확인하십시오. 현재 범위를 벗어나면 서버 측 세션을 파괴하고 적합한 메시지와 함께 로그인 페이지로 강제 전환하십시오.

일단 작업을 완료하면 시간 제한을 피하기 위해 인위적으로 페이지를 새로 고치지 않으면 서버 측 값을 변경할 수 없습니다.하지만이 경우 사용자는 "실제"페이지 요청과 세션 타이머를 재설정하기 위해 설계된 요청 간의 차이. 사용자 컴퓨터의 악의적 인 소프트웨어 또는 사용자 연결에 대한 고급 man-in-the-middle 공격에 대해 걱정할 경우 세션 시간 초과보다 더 큰 문제가 발생합니다.

일단 이것이 설정되면 JavaScript를 사용하여 자동으로 로그 오프 된 자동 메시지를 보여주는 각 페이지에서 타이머를 실행할 수 있습니다. 타임 아웃과 같은 시간 동안이 타이머를 설정하면 AJAX 작업이 페이지에서 트리거되면 다시 시작됩니다. 이 메시지를 리디렉션하지 않고 DOM에 삽입 할 수 있으므로 사용자가 양식을 작성하면 작업을 잃지 않습니다.

당신이 말했듯이 타이머를 재설정하기 위해 양식 키 스트로크를 항상 감지 할 수 있습니다. 이렇게하려면 AJAX 작업을 빈 응답으로 응답하는 서버에 보내십시오. 쿠키는 자동으로 보내집니다. 표준 세션 코드도 여기에서 실행되도록하십시오. 모든 언론에 대해 AJAX op를 보내지 않도록 자바 스크립트 타이머를 사용하십시오. 때때로 키를 누르는 것보다 10 초 후에 간다면 연결이 어려워 지므로 애플리케이션을 신속하게 유지해야합니다.

+0

그냥 간단한 질문입니다. 마지막 단락을 실제로 구현 했습니까? 내 말은, 페이지를 새로 고치지 않고 javascript를 직접 사용하지 않고 서버에 AJAX op를 보내려면 어떻게해야합니까? 사용자가 실제로 다른 페이지를로드 할 때 서버 쪽을 검사 할 두 번째 쿠키 또는 세션 변수를 만들거나 업데이트하는 데 javascript를 사용하는 방법에 대해 생각했습니다. 어떻게 생각해? – webeno

+0

정의에 의한 AJAX 작업에는 페이지 리디렉션이 포함되지 않으며 JavaScript는 데이터베이스와 직접 통신하지 않습니다. PHP 스크립트에 대한 AJAX 호출을 작성하면 클라이언트를 대신하여 서버 세션을 업데이트합니다. 이 글을 직접 쓰는 것이 좋습니다. 첫 번째 컷에서'keypress' 나'change'와 같은 이벤트로'input' 요소에 바인딩하는 jQuery와 같은 것을 사용하십시오. [다음 예가 있습니다] (http://api.jquery.com/keypress/) 이벤트로 트리거합니다. 그게 효과가되면, 당신은 좀 더 복잡한 속도 제한 물건을 할 수 있습니다. – halfer

+0

그래서 기본적으로 jQuery를 사용하여 입력 요소의 값을 업데이트하고 페이지가로드 될 때 해당 값 서버 측을 호출합니다 (세션 변수 또는 쿠키가 필요하지 않음을 깨달았습니다. POST 메서드를 사용하여 호출 할 수 있습니다. ..) 또는 활동이없는 경우 서버 측 세션 중지 (로그 아웃)를 호출하십시오. "속도 제한 요소"란 무엇입니까? – webeno