2009-06-15 4 views
2

문제가있는 응용 프로그램은 일반적인 웹 응용 프로그램입니다 ... 사용자를 처리하는 방법에 특별한 것은 없습니다. 즉, 쿠키를 통해 관리되는 세션을 사용하여 세션 변수에서 사용자 정보를 처리합니다.PHP 사용자 세션 '혼란스러워'

내 클라이언트가 사용자가 로그인하고 다른 사용자의 페이지가 표시 될 때마다 문제가 발생합니다 (사용자 이름이 각 페이지의 맨 위에 있기 때문에 쉽게 확인할 수 있음).). '집'링크를 클릭하면 모든 것이 다시 정상적으로 작동합니다.

지금까지 PHP 지식에 관한 한, 이런 종류의 것을 혼합하는 데는 약간의 노력이 필요할 것입니다. 맞습니까? 우리의 개발 환경에서이 문제를 재현 할 수는 없지만, 내가 말한 것처럼 실제로 이런 종류의 세션 정보를 '공유'하기 위해 노력할 것입니다 ...

그래서 제 질문 가능한 문제가 무엇일까요? 전에 "경험이 잘못된"프록시 서버 때문에 이러한 경험을 할 때마다 요청을 프록시 처리하지 않는다고 말하고 있습니다.

내가 찾을 수있는 자료가 있습니까? 이것에 대한 다른 가능한 이유 (자연적으로 이것은 내 코드에 문제가있을 수 있음)?

덕분에 ...

답변

2

은 그래서 의 최종 결과는이 상황, 적어도 상당히 괴짜라고 밝혀졌습니다.

클라이언트가 휴대용 컴퓨터를 사용하여 응용 프로그램에 액세스하고 배터리를 평평하게하는 것으로 나타났습니다. 이 특정 장치는 배터리가 결국 재충전 될 때 시계를 2005 년으로 재설정하고 브라우저가 캐시에서 특정 페이지를 읽도록 유도 한 것처럼 보입니다.

장치의 시계가 올바르게 설정되자 마자 문제가 해결되었습니다.

제안에 감사드립니다. 이러한 캐싱 유형 문제를 디버깅하는 것이 싫습니다. 데이터를 캐싱하는 핸드 헬드를 시도하고 중단 시키려면 헤더를 추가해야합니다.

0

당신은 그 (또는 매개 변수로 세션 ID를 가지고 다른 요청)에서 세션 ID가 링크를 사용자에게 제시하고 있는가?

+0

아니요, 아니요. 브라우저가 쿠키를받지 못하면 기본값으로 설정됩니다. 요청의 세션 ID를 사용하면 상황이 좋든 나쁘든지 생각할 수 있습니까? – Narcissus

+0

악화 된 링크는 사용자가 자신의 session_id를 사용하여 공유 할 수 있으며 해당 계정에 로그인되어 있기 때문입니다. 그게 내가 생각하고있는 일이야. 그것은 당신의 지식 (또는 사용자)이 세션 ID 나 이상한 것을 요구하는 Ajax 쿼리를 사용하지 않고 계속 진행될 수 있습니다. –

2

고객의 소리에도 불구하고 고객이 보증하지는 않지만 여전히 프록시 나 캐싱 문제가있는 것 같습니다. 가능하다면 요청이 최신 상태인지 확인하기 위해 페이지가 사용자 필드 근처의 어딘가에 생성되었을 때 타임 스탬프와 같은 것을 추가 할 수 있습니다.

이 방법은 페이지가 엉망인 경우 페이지가 일찍 생성되어 어떤 방법으로 저장되었는지 여부를 나타냅니다. 아약스 결과가 브라우저에 의해 캐시되고 클라이언트가 동일한 웹 브라우저에 여러 사람을 보유하고 있다면 프록시가 엉뚱한 결과를 얻지 않아도됩니다.

이 문제를 공격 할 수있는 또 다른 방법은 클라이언트의 요청을 로깅하고 놓친 것이 있는지 확인하는 것입니다. 요청을 재생하면 동일한 결과가 나타 납니까?

사용자 A로 로그인하여 세션 쿠키를 놓아 버리면 (삭제하면) 원하는 정보를 얻을 수 있는지 확인할 수 있습니까? 그렇다면 인증이 처리되는 방식에 문제가있을 수 있습니다.

희망이 도움이됩니다.

+0

저는 "정보 제공"목적으로 페이지 양식에 타임 스탬프 아이디어를 좋아합니다. 이것은 확실히 내가 생각하도록 도왔을 것입니다. – Narcissus

1

세션에 IP 주소를 저장하고 세션의 주소와 현재 사용자의 IP가 일치하지 않는 경우와 같은 일종의 세션 확인을 수행하는 것이 좋습니다.

물론 IP를 일치시키지 않으면 사용자를 강제로 새 세션으로 만들 수 있습니다. 이 같은 뭔가 일을 생각 :

session_start(); 

if (isset($_SESSION['ip'])) { 
    if ($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) { 
     session_regenerate_id(); 
     session_destroy(); 
     session_start(); 
     $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
    } 
} else { 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
}