$_SESSION['CSRFToken'] = base64_encode(random_bytes(32)); session_start(); if ( !isset($_POST['CSRFToken']) || !hash_equals($_SESSION['CSRFToken'], $_POST['CSRFToken']) ) { die('CSRF Token Error'); } <?php session_start(); if (empty($_SESSION['CSRFToken'])) { $_SESSION['CSRFToken'] = bin2hex(random_bytes(32)); } ?> <form action="transfer.php" method="post"> <input type="hidden" name="CSRFToken" value="<?= htmlspecialchars($_SESSION['CSRFToken'], ENT_QUOTES) ?>"> <input type="text" name="name"> <input type="submit" value="전송"> </form> <?php session_start(); if ($_SERVER['REQUEST_METHOD'] !== 'POST') { exit('잘못된 접근입니다.'); } // 토큰 존재 여부 확인 if (!isset($_POST['CSRFToken']) || !isset($_SESSION['CSRFToken'])) { exit('CSRF Token이 없습니다.'); } // 토큰 비교 if (!hash_equals($_SESSION['CSRFToken'], $_POST['CSRFToken'])) { exit('CSRF Token이 일치하지 않습니다.'); } // 1회용 토큰이면 삭제 unset($_SESSION['CSRFToken']); // 정상 처리 echo "정상 요청입니다.";
|