2017-11-10 8 views
0

이 항목에 대한 질문을 보았지만 해결 방법을 찾을 수 없습니다. 내 인덱스 페이지의 상단에 나는 단순히CSRF 처리시 토큰 유효성 확인

<?php 
session_start(); 

function generate_secure_token($length = 16) { 
    return bin2hex(openssl_random_pseudo_bytes($length)); 
} 

$_SESSION['token'] = generate_secure_token(); 
$token = $_SESSION['token']; 

?> 

하고있는 중이 야 그럼 내 양식에서 숨겨진 필드로 $token을 설정합니다. 내 질문은 양식 처리와 관련이 있습니다. 내가 가지고있는 순간

if (empty($_POST[ 'csrf_token' ])) 
{ 
    $errors['token'] = 'Something went wrong'; 
} 

그래서 토큰이 있는지 단순히 확인합니다. 이것이 충분하나요? 토큰을 다시 만든 다음 세션 토큰과 비교하는 다른 예제를 보았습니다.하지만 필요한지 확실하지 않습니다.

내가 올바르게 확인할 수있는 방법에 대한 조언.

감사

+2

_ "이 정도인가?"_ 아니, 당신은 확인 필요 사용자가 게시 한 토큰은 이전에 작성한 토큰과 일치합니다. 그렇지 않으면, 사용자는 단지 어떤 쓰레기를 토큰으로 보낼 수 있습니다. –

+0

[OWASP CSRF Cheat Sheet] (https://www.owasp.org/index.php/Cross-Site_Request_Forgery_ (CSRF) _Prevention_Cheat_Sheet)를 읽고 나서 가능한 경우 [CSRFProtector] (https : //www.owasp.org/index.php/CSRFProtector_Project) – heavyd

답변

1

당신이해야 도입 된 토큰이 유효한지 확인하기 위해 세션 토큰에 주어진 토큰을 비교 :

if (empty($_POST[ 'csrf_token' ]) || 
    $_POST[ 'csrf_token' ] != $_SESSION['token']) 
{ 
    $errors['token'] = 'Something went wrong'; 
} 
+1

타이밍 공격에 취약합니다. – PeeHaa

+0

CSRF 솔루션을 구현 한 후 숨겨진 필드를 서버 측과 비교하면 같은 URL로 새 탭을 열면 숨겨진 필드가 null이됩니다. 서버 측 조건은 CSRF 숨겨진 필드가 null 인 경우 해당 공격이 예상되는 동작입니까? – Rudra