제공된 코드는 토큰 생성 방식에서 비롯되었을 가능성이 높습니다. 예측에 취약하고 엔트로피가 부족합니다. 이 방법은 일회용 및 양식별 토큰 검증에도 불충분합니다.
토큰 생성을 보안으로 대체하세요. PHP 7 또는 PHP 5.3용 메서드:
session_start();
if (empty($_SESSION['token'])) {
$_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];
session_start();
if (비어 있음($_SESSION['토큰'])) {
if (function_exists('mcrypt_create_iv')) { $_SESSION['token'] = bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)); } else { $_SESSION['token'] = bin2hex(openssl_random_pseudo_bytes(32)); }
}
$token = $_SESSION['token'];
토큰을 확인하려면 hash_equals()를 사용하세요. 안전하게:
if (!empty($_POST['token'])) {
if (hash_equals($_SESSION['token'], $_POST['token'])) { // Proceed to process the form data } else { // Log this as a warning and keep an eye on these attempts }
}
추가로 제한하려면 토큰을 특정 형식으로 변환하려면 hash_hmac():
echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
?>를 사용하세요. ;" />
Twig 템플릿을 사용하는 경우 단순화된 이중 전략은 다음과 같습니다. 구현됨:
$twigEnv->addFunction(
new \Twig_SimpleFunction( 'form_token', function($lock_to = null) { if (empty($_SESSION['token'])) { $_SESSION['token'] = bin2hex(random_bytes(32)); } if (empty($_SESSION['token2'])) { $_SESSION['token2'] = random_bytes(32); } if (empty($lock_to)) { return $_SESSION['token']; } return hash_hmac('sha256', $lock_to, $_SESSION['token2']); } )
);
이 기능을 사용하면 보안 일반 토큰을 다음과 같이 사용할 수 있습니다.
양식별 토큰은 다음을 사용하여 생성할 수 있습니다.
일회성 토큰 요구 사항의 경우 다음과 같은 전용 라이브러리 사용을 고려하세요. Paragon Initiative Enterprises의 안티 CSRF 라이브러리.
위 내용은 AJAX 및 표준 양식에서 사용할 때 CSRF 토큰이 때때로 비어 있는 이유는 무엇이며, PHP에서 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!