2013-04-29 2 views
0

문제점이있어서 해결책을 찾을 수 없습니다. 문제는 사용자가 페이지를 열 때 보안 토큰은 다음과 같이 생성 내가 CSRF 보안에 대한 숨겨진 입력으로 양식 제출이 $ 토큰을 사용하는 SESSION 배열배열에서 사용하지 않은 보안 토큰을 제거하는 방법

$token = generate_csrf_token(); 
$_SESSION['tokens'][] = $token; 

에 추가되는 것입니다. 사용자 내가 코멘트 후 배열에서 $ 토큰을 삭제할 수 있습니다 귀하의 의견을 게시하는 경우 지금, 문제는,이

$token = $_POST['token']; 

// comment posting process 

$key = array_search($token, $_SESSION['tokens']); 
unset($_SESSION['tokens'][$key]); 

처럼 게시 그러나중인 사용자는 어떻게 페이지를 어떤 코멘트를 게시하고 종료하지 않는 경우, I $ $_SESSION['tokens'][] 배열에서 $ 토큰을 삭제할 수 있습니다. 삭제하지 않으면 어레이에 사용되지 않은 $ 토큰이 너무 많이 발생할 수 있습니다.

+1

언제 세션을 종료합니까? – Hemc

답변

1

정상적인 상황에서 사용자가 페이지를 종료하면 쿠키 참조가 삭제됩니다. (그가 브라우저를 닫을 때). 다음에 그는 브라우저를 열고 페이지를 방문 할 때 새로운 세션을 시작합니다.

그가 세션에 대한 참조를 잃었으므로 다른 사람이이 세션을 사용하고 있지 않으므로 세션 파일에 더 이상 액세스하지 않고 일정 기간 액세스하지 않으면 가비지 수집기가이를 지 웁니다.

그래서 사용자가 페이지를 떠날 때 "보안 토큰 지우기"에 대해 걱정할 필요가 없습니다. 그것은 자동으로 처리됩니다. 물론 세션 관리를하지 않았다면. 변경할 수있는 옵션은 session settings 정보를 참조하십시오.

이제 동일한 세션을 사용하여 사용자가 페이지에있는 동안 토큰을 지우는 것이 목표라면 몇 가지 옵션이 있습니다.

첫 번째 세션 당 하나의 보안 토큰을 사용하는 것입니다. 사용자가 페이지를 닫으면 (읽기 : 사이트의 다른 페이지를로드하는 경우) 그는 $_SESSION['token'] (배열 없음)에 새 토큰을 발행하고 이전 토큰은 지워집니다. 토큰을 변경하기 전에 POST 뒤에 토큰을 확인해야합니다.

또 다른 옵션은 마지막 5 개 정도의 토큰 만 유지하는 것입니다. 그런 다음 토큰에 대한 점검을 변경하지 않고 깨끗하게 유지할 수 있습니다. 당신은 내가 생각할 수있는

<? 
$tokens[] = 'new token'; 
if (count($tokens)>5) { 
    array_shift($tokens); //first is removed, so the last 5 remain 
} 
?> 

마지막 방법은 모든 토큰 토큰과 페이지 요청, 루프 통에 시간을 추가하고 시간을 확인하는 것이라고 할 array_shift를 사용할 수 있습니다. 과거 시간이 xx 분보다 길면 제거하십시오.

1

비동기 클라이언트 - 서버 상태와 마찬가지로 대답은 시간 초과입니다. 토큰이 사용된다는 것을 보장 할 수 없으며 결국 토큰이 사용 되더라도이를 알 수는 없습니다. 사용되지 않은 토큰에 대한 명시적인 피드백 메커니즘도 없습니다. 사용되지 않은 토큰은 단순히 사용되지 않습니다.

이와 같이 각 토큰에 타임 스탬프를 연결하십시오. 저장된 토큰을 주기적으로 확인하고 만료 된 토큰을 제거하십시오. 합리적인 만료 기간을 선택하십시오. 예컨대 :

// run garbage collection roughly every 100 page loads 
if (mt_rand(0, 100) == 0) { 
    foreach ($_SESSION['tokens'] as $i => $token) { 
     if ($token['timestamp'] < time() - 3600) { 
      unset($_SESSION['tokens'][$i]); 
     } 
    } 
} 

세션은 결국 같은 메커니즘에 의해 스스로 모든 만료 이후, 아마도 당신은 단순히 세션 만료에이를 남길 수 있습니다.