>백엔드 개발 >PHP 튜토리얼 >AJAX 및 표준 양식에서 사용할 때 CSRF 토큰이 때때로 비어 있는 이유는 무엇이며, PHP에서 이 문제를 어떻게 해결할 수 있습니까?

AJAX 및 표준 양식에서 사용할 때 CSRF 토큰이 때때로 비어 있는 이유는 무엇이며, PHP에서 이 문제를 어떻게 해결할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-12-14 20:46:13652검색

Why are my CSRF tokens sometimes empty when used in AJAX and standard forms, and how can I fix this in PHP?

PHP에서 적절한 CSRF 토큰 구현으로 양식 보안

질문:


< ;p>두 개의 서로 다른 양식에 CSRF 토큰을 추가하려고 할 때, 하나는 다음을 사용합니다. AJAX 및 기타 기본 문의 양식에서는 HTML의 토큰 값이 산발적으로 비어 있는 것으로 관찰됩니다. 이 문제를 어떻게 해결할 수 있나요?

답변:

제공된 코드는 토큰 생성 방식에서 비롯되었을 가능성이 높습니다. 예측에 취약하고 엔트로피가 부족합니다. 이 방법은 일회용 및 양식별 토큰 검증에도 불충분합니다.

강력한 CSRF 토큰 생성:

토큰 생성을 보안으로 대체하세요. PHP 7 또는 PHP 5.3용 메서드:

PHP 7


session_start();
if (empty($_SESSION['token'])) {

$_SESSION['token'] = bin2hex(random_bytes(32));

}
$token = $_SESSION['token'];

PHP 5.3(또는 ext-mcrypt 사용)


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'];

CSRF 토큰 확인:

토큰을 확인하려면 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
}

}

Per -토큰 제한 양식:

추가로 제한하려면 토큰을 특정 형식으로 변환하려면 hash_hmac():


echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);

?>를 사용하세요. ;" />

Twig 통합을 통한 하이브리드 접근 방식:

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']);
    }
)

);

이 기능을 사용하면 보안 일반 토큰을 다음과 같이 사용할 수 있습니다.



양식별 토큰은 다음을 사용하여 생성할 수 있습니다.



일회용 CSRF 토큰:

일회성 토큰 요구 사항의 경우 다음과 같은 전용 라이브러리 사용을 고려하세요. Paragon Initiative Enterprises의 안티 CSRF 라이브러리.

위 내용은 AJAX 및 표준 양식에서 사용할 때 CSRF 토큰이 때때로 비어 있는 이유는 무엇이며, PHP에서 이 문제를 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.