2010-01-27 4 views

답변

17

참고 :my previous answer에서 촬영.

용어

  • 사용자 : 방문자.
  • 클라이언트 : 특정 컴퓨터에 설치된 특정 웹 가능 소프트웨어. 위해

이해 세션

먼저 세션이 어떻게 작동하는지 이해해야합니다, 세션이 보안을 강화하는 방법을 이해합니다.

는 이제이 코드 조각을 보자 :

session_start(); 

을 최대한 빨리 PHP는 (기본적으로) PHPSESSID라는 쿠키를 찾습니다 것을 전화로. 이 발견되지 않으면, 그것은 하나를 만들 것입니다 :

PHPSESSID=h8p6eoh3djplmnum2f696e4vq3 

를가 발견되면, 그것은 PHPSESSID의 값을 취하고 해당 세션을로드합니다. 이 값을 session_id이라고합니다.

이것이 클라이언트가 알 수있는 유일한 것입니다. 세션 변수에 추가하는 것은 서버에 유지되며 절대로 클라이언트로 전송되지 않습니다. $_SESSION의 내용을 변경하면 해당 변수가 변경되지 않습니다. 당신이 그것을 파괴하거나 시간이 끝나기 전까지는 항상 같은 상태를 유지합니다. 따라서 해시 또는 다른 방법으로 클라이언트가 정보를 수신하거나 보내지 않아서 $_SESSION의 내용을 난독 화하려고 시도하는 것은 쓸모가 없습니다.

그런 다음, 새로운 세션의 경우, 당신은 변수를 설정합니다 :

$_SESSION['user'] = 'someuser'; 

클라이언트는 해당 정보를 볼 수 없을 것입니다. 악의적 인 사용자가 다른 사용자의 session_id을 훔치는 경우


문제점

있는 보안 문제가 발생할 수 있습니다. 일종의 수표없이 그는 그 사용자를 사칭 할 자유가 있습니다.우리는 고객이 아닌 클라이언트를 고유하게 식별 할 수있는 방법을 찾아야합니다.

가장 효과적인 전략은 세션을 시작한 클라이언트의 IP가 세션을 사용하는 사람의 IP와 동일한 지 확인하는 것입니다.

if(logging_in()) { 
    $_SESSION['user'] = 'someuser'; 
    $_SESSION['ip'] = $_SERVER['REMOTE_ADDR']; 
} 

// The Check on subsequent load 
if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR']) { 
    die('Session MAY have been hijacked'); 
} 

그 전략의 문제는 클라이언트가 사용자가 동적 IP를 가지고 (긴 기간 세션에)로드 밸런서, 또는를 사용하는 경우, 그것은 거짓 경고를 트리거 것입니다.

또 다른 전략은 클라이언트의 사용자 에이전트를 확인하는 것을 포함한다 :

if(logging_in()) { 
    $_SESSION['user'] = 'someuser'; 
    $_SESSION['agent'] = $_SERVER['HTTP_USER_AGENT']; 
} 

// The Check on subsequent load 
if($_SESSION['agent'] != $_SERVER['HTTP_USER_AGENT']) { 
    die('Session MAY have been hijacked'); 
} 

그 전략의 단점은 클라이언트 업그레이드 경우 브라우저는 점이다 또는 부가 기능 (일부는 사용자 에이전트에 추가)를 설치, 사용자 에이전트 문자열이 변경되고 잘못된 경고가 트리거됩니다.

또 다른 전략은 각 5 요청마다 session_id을 회전하는 것입니다. 그런 식으로 session_id은 이론적으로 도용 될만큼 오래 있지 않습니다.

if(logging_in()) { 
    $_SESSION['user'] = 'someuser'; 
    $_SESSION['count'] = 5; 
} 

// The Check on subsequent load 
if(($_SESSION['count'] -= 1) == 0) { 
    session_regenerate_id(); 
    $_SESSION['count'] = 5; 
} 

이러한 전략을 원하는대로 조합 할 수 있지만 단점도 함께 고려해야합니다.

불행히도, 해결책은 바보가 아닙니다. session_id이 손상되면 거의 완료됩니다. 위의 전략은 막 스톱 갭 조치입니다.

관련 문제