2016-07-07 2 views
1

나는 현재 유효성을 확인하기위한이 두 기능, 토큰을 생성하기위한 하나 하나가 :보안 양식과 동일한 페이지에 CSRF 토큰을 생성하는 것이 안전합니까?

function getToken() { 
    if(isset($_SESSION['token'])) { 
     return $_SESSION['token']; 
    } else { 
     $token = //random key generator goes here; 
     $_SESSION['token'] = $token; 
     return $token; 
    } 
} 

function validateToken($token) { 
    if ($token == getToken()){ 
     return true; 
    } else { 
     return false; 
    } 
} 

을 그리고 내 등록 양식이 숨겨진 입력 포함이 안전한가요

<input type="hidden" name="token" value="<?php echo getToken(); ?>"> 

를? 나는 합법적 인 사용자의 세션이 만료되면 CSRF가이 등록 양식에 도달하고 악의적 인 사이트/iframe 자체가 세션에 존재하지 않아 토큰을 생성하므로 어떤 인증을했는지 묻는 중입니까?

쿠키로 인해 사용자가 계속 로그인 한 것으로 가정합니다.

내가 잘못 이해하고 있습니까? iframe과 같은 원격 연결이 백엔드에서 세션을 생성 할 수 없습니까?

+0

... 세션이 이보다 안전하지 않은 이유는 무엇입니까? – Machavity

+0

@Machavity 죄송합니다, 당신이하려는 말을 이해할 수 없습니다. 필자가 묻는 것은 폼이 목적을 이겨내는 것과 같은 페이지에서 토큰을 생성하는 것을 상상하기 때문에 접근 방법이 안전 할까하는 것입니다. 그렇죠? –

+0

"토큰을 양식과 같은 페이지에 생성"--- 무슨 의미입니까? CSRF 토큰은 추측 할 수 없어야합니다. 이것이 유일한 요구 사항입니다. – zerkms

답변

0

아니요. 제가 알 수있는 한 사용자가 양식 페이지를 방문하자마자 토큰을 생성해야하므로 올바른 방법을 사용하고 있습니다. 그런 다음 누군가 (실제 사용자)가 실제로 자신의 양식을 방문한 다음 해당 토큰을 설정하고 있음을 확실히 알기 위해 생성합니다.

양식에 대한 작업을 수행 할 때 토큰을 검사하여 토큰이 해당 사용자에게 유효한 지 확인합니다. 그래서, 당신이 바로하고 있다고 생각합니다.

사용자가 폼 페이지를 요청하거나받을 때 세션에 토큰을 생성하고 저장하는 것이 하나 있습니다. 요청이 올 때마다 생성하는 것이 좋습니다. 그런 다음 각 양식 제출이 성공한 후 세션에서 점검 된 토큰을 지우십시오.

+0

"요청이 올 때마다 생성하는 것이 좋습니다." --- 확실히 고통 스러울 지 모르지만 보안 관점에서 볼 때 왜 "더 나은"이유가 명확하지 않습니다. – zerkms

+0

세션이 적은 양의 시간 동안 토큰을 저장하기 때문에 세션 하이재킹을 방지하는 데 도움이됩니다. –

+0

세션을 도난당한 경우 CSRF와 어떤 관련이 있습니까? 세션 ID가 있습니다. 페이지로 이동하여 방금 생성 된 토큰으로 요청을 수행합니다. – zerkms