>백엔드 개발 >PHP 튜토리얼 >PHP에서 CSRF 토큰을 안전하게 구현하는 방법은 무엇입니까?

PHP에서 CSRF 토큰을 안전하게 구현하는 방법은 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-08 00:39:12325검색

How to Securely Implement CSRF Tokens in PHP?

PHP에서 CSRF 토큰을 구현하는 방법: 종합 가이드

강력한 토큰 생성을 위해 무작위 바이트 사용

CSRF 토큰 생성의 맥락에서 rand() 및 uniqid()를 사용하면 보안 위험이 발생합니다. 예측 가능성과 제한된 엔트로피. 대신 다음을 선택하세요.

session_start();
if (empty($_SESSION['token'])) {
    $_SESSION['token'] = bin2hex(random_bytes(32));
}
$token = $_SESSION['token'];

CSRF 토큰을 안전하게 확인

직접 동일성 검사(== 또는 ===)를 사용하지 마세요. 대신, PHP 5.6의 경우 hash_equals()를 사용하고 이전 버전의 경우 paragonie/hash-compat를 사용하세요.

if (!empty($_POST['token'])) {
    if (hash_equals($_SESSION['token'], $_POST['token'])) {
         // Proceed to form data processing
    } else {
         // Log and monitor these attempts
    }
}

양식별 토큰으로 보안 강화

토큰을 제한하려면 특정 양식에 사용 hash_hmac():

echo hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
$calc = hash_hmac('sha256', '/my_form.php', $_SESSION['second_token']);
if (hash_equals($calc, $_POST['token'])) {
    // Continue...
}

단순성을 위한 하이브리드 접근 방식

Twig 템플릿을 사용하면 사용자 정의 Twig 기능을 사용하여 토큰 생성을 단순화할 수 있습니다.

$twigEnv->addFunction(
    new \Twig_SimpleFunction(
        'form_token',
        function($lock_to = null) { // ... }
    )
);
<input type="hidden" name="token" value="{{ form_token() }}" />

또는 잠긴 경우 토큰:

<input type="hidden" name="token" value="{{ form_token('/my_form.php') }}" />

일회용 CSRF 토큰

필요한 경우 Anti-CSRF와 같은 특수 라이브러리를 사용하여 일회용 CSRF 토큰을 관리하는 것이 좋습니다. Paragon Initiative Enterprises의 도서관.

위 내용은 PHP에서 CSRF 토큰을 안전하게 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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