2009-11-22 10 views
4

저는 PHP로 RIA 작업을하고 있습니다. 세션 하이재킹을 막으려면 로그인시 생성 된 토큰을 소금, ISO-8601 주 번호 및 사용자 IP를 기반으로 도입했습니다.PHP : 토큰을 쿠키로 저장하여 세션 하이재킹을 막으시겠습니까?

$salt  = "blahblahblah"; 
$tokenstr = date('W') . $salt . $_SERVER['REMOTE_ADDR']; 
$token_md5 = md5($tokenstr); 
define("token_md5", $token_md5); 

현재, 그것은 모든 요청 GET 또는 POST를 통과,하지만 그것은 사용자의 IP에 의존하기 때문에 나는 쿠키로 제공함으로써이 문제를 피할 수 있는지 궁금 해서요. 나는 지금 막 세션을 배우기 때문에 보안 문제가 있는지 궁금하다. 나쁜 생각입니까?

답변

7

사용자가 보유한 모든 데이터는 도난 당할 수 있습니다. 방문자가 보내는 모든 데이터는 스푸핑 될 수 있습니다. 세션이 열릴 때 $_SESSION에 원격 IP를 저장하고 모든 요청과 원격 IP를 비교하는 것이 좋습니다. 일치하지 않으면 아마 도용 일 것입니다. 새 ID를 생성하고 사용자가 다시 로그인하게하십시오.

+0

일반 세션 재생성과 토큰을 조합하거나 다른 두 가지를 삭제하고 IP를 비교해야한다고 생각합니까? 나는 현재의 토큰이 이것을 커버한다고 생각한다. 왜냐하면 사용자의 IP로 액세스하려고 시도하기 때문이다. 즉, 유효한 사용자의 토큰을 스푸핑하는 것은 IP를 공유하지 않는 한 좋지 않습니다. 맞습니까? – Greg

+0

확실히 결합되어 있지 않습니다. 세션 재생성은 보안과 관련하여 많은 것을 얻지는 않지만 다른 용도로 자유롭게 사용할 수 있습니다. 토큰의 경우, 하이 잭 범인은 표적의 토큰을 훔치기보다는 소금을 다룰 수 있다면 (소금을 덜 만들고 비밀 키를 더 많이 만들 수 있다면) 자신의 것을 생성 할 수 있습니다. 클라이언트의 데이터가 신뢰할 수없고 세션의 주요 지점이 클라이언트에 저장해야하는 유일한 것이 세션 ID라는 점을 감안할 때 클라이언트에 데이터를 저장하는 모든 구성표를 삭제하십시오. 서버 측에서 IP (및 날짜)는 비밀이 아니므로 해시가 필요하지 않습니다. – outis

+0

이 기술을 사용하여 CSRF를 조심하십시오. 이것만으로는 사용자의 의도를 확인하지 않고 로그인 한 것입니다. 공격자는 공격자 자격 증명으로 새 관리자를 만드는 것과 같이 양식 중 하나의 동작으로 연결되는 링크를 클릭하도록 유도 할 수 있습니다. 이를 방지하려면 질문에서 기술을 사용하여 해시를 만들고이를 폼의 동작 (및 세션)에 추가 한 다음 반대쪽 끝을 비교합니다. 두 값이 일치하는 경우에만 작업을 수행하십시오. 즉, 작업에 클릭 한 사용자가 처음에 양식을 생성 한 것과 같습니다. – DampeS8N

7

session_regenerate_id()은 세션 하이재킹 방지에 적합합니다.

session_regenerate_id는 - 새로

하나는 지속적으로 모든 페이지 방문에 대한 SESSION_ID를 회전 생성과 현재의 세션 ID를 업데이트합니다. 끊임없이 움직이는 표적을 납치하는 것을 매우 어렵게 만듭니다.

+0

나는 그것을 가지고 있지만 그것이 주로 고정을위한 것이라고 생각했습니다 : if (! isset ('generated')) || $ _SESSION [ ' 생성 된 '] <(시간() - 30)) {session_regenerate_id(); $ _SESSION [ 'generated'] = 시간(); } 요청이있을 때마다 재생성하면 토큰을 과도하게 사용합니까? (앱은 대부분 아약스 기반입니다)? – Greg

+2

'session_regenerate_id'에'true '를 넘겨주지 않으면 하이 잭 범인이 이전 세션을 계속 사용할 수 있습니다. 또한 "어렵다"는 "할 수 없다"와 같지 않습니다. 당신이 납치범이 성공하면, 사용자는 그들의 세션에서 부팅됩니다. – outis

+0

해커가 돌아 다니기가 힘들지 만 뒤로 버튼이 끊어지는 것은 아닌가? 이 접근법은 합법적 인 사용자에게 매우 실망 스러울 수 있습니다. –

0

나는 당신이 한 것과 같은 접근 방식으로 RIA를 해왔고 보안을 위해 응용 프로그램에 SSL을 설정했습니다. Flex와 원격은 세션이 없기 때문에. SSL을 사용하는 것이 좋습니다. 공동 작업자는 또한 사용자 로그인/로그 아웃으로 응용 프로그램을 개발했으며 동일한 작업을 수행했습니다.

관련 문제