2013-09-08 2 views
0

CSRF에 대한 기사를 많이 읽었습니다. 거의 모든 솔루션에는 숨겨진 토큰과 동일한 솔루션이 있으므로 CSRF를 방지하는 코드를 작성했으며 이후에 내 페이지를 해킹하려고했지만 작동하지 않았습니다. , 내 코드 CSRF 방탄 경우, 그리고 어쨌든 주위에 있는지 알고 싶습니다.CSRF PHP 예방 메커니즘

내가 한 나는 다음과 같은 작성합니다 각 페이지에 있도록 그들의 형태를 가지고 네 페이지 :

  if (isset($_POST['submit'])){ 

      // Check for CSRF token 
      if ($_SESSION['token'] === $_POST['token']){ 

       // write to db 

      }else{ 
       // CSRF attack has been detected 
       die("CSRF :<br>1: $_SESSION[token] <br> 2: $_POST[token]"); 

      } 

     }else{ 
      // assign CSRF prevention token 
      $form_token = md5((rand(1,89412) * 256/4).$date.time()); 
      $_SESSION['token'] = $form_token; 
     } 
     ?> 
     <form action='' method='post'> 
     <input type='hidden' name='token' value='<?echo $form_token;?>'> 

이 방법은 내 웹 사이트에 CSRF를 사용하는 공격자를 막을 충분한 것입니까?

고맙습니다.
구성 파일이 자동으로로드 require 또는 include 기능을 사용하여 모든 페이지에 있어야

의 config.php :

+0

이 "블라인드"를 게시에서 방지하거나 자동화 된 형태는 예방 공격의 한 부분입니다 ... 제출합니다. 세션 (id)도 안전해야 세션 쿠키와 마찬가지로 하이재킹 될 수 없습니다. – djot

+0

내 웹 사이트가 여전히 CSRF에 취약하다는 의미입니까? 그렇다면 어떻게 방지 할 수 있습니까? – user2585384

+0

글쎄, 나는 보안 전문가가 아니지만 ... 당신의/사용자 세션 아이디를 납치 할 수 있다면 폼 토큰은 쓸모가 없다. – djot

답변

0

난 당신에게 CSRF 방지를위한 내 코드를 보여 드리겠습니다.
모범 사례는 구성 클래스를 작성하는 것입니다. 코드를 단순화하기 위해 함수를 기록합니다.

session_start(); 

if(empty($_SESSION['CSRF'])){ 
     $_SESSION['CSRF'] = secureRandomToken(); 
    } 

post.php는
이것은 단지 예제이다. 모든 "게시"페이지에서 CSRF 토큰이 설정되어 있는지 확인해야합니다. POST 방법으로 양식을 제출하십시오! 또한 Slim Framework 또는 Laravel Lumen을 살펴 보도록 권합니다.이 라우팅 시스템은 "post.php"페이지에서만 POST 요청을 매우 쉽게 받아 들일 수있게 해줄 것입니다 (CSRF 토큰을 자동으로 추가합니다) 모든 형태로).

view.php

if (!empty($_POST['CSRF'])) { 
    if (!hash_equals($_SESSION['CSRF'], $_POST['CSRF'])) { 
     die('CSRF detected.'); 
    } 
}else{ 
    die('CSRF detected.'); 
} 

이제 당신은 그냥 당신의 CSRF 세션 값을 가진 숨겨진 입력을 넣어해야합니다.

<input type="hidden" name="CSRF" value="<?= $_SESSION['CSRF'] ?>"> 

나는이 빠른 설명 당신을 도울 수 있기를 바랍니다 :)