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

PHP 양식에서 CSRF 토큰 보호를 안전하게 구현하는 방법은 무엇입니까?

DDD
풀어 주다: 2024-12-17 20:00:20
원래의
326명이 탐색했습니다.

How to Securely Implement CSRF Token Protection in PHP Forms?

CSRF 방어 기술 관리: PHP 양식을 통한 연습

소개

웹 사이트에 적절한 보안 강화를 추가하려면 주소 지정이 필요합니다. CSRF(교차 사이트 요청 위조)를 포함한 잠재적인 취약점. 이 기사에서는 PHP를 사용하여 CSRF 토큰을 효과적으로 추가하는 방법을 자세히 설명합니다.

문제 이해

웹 사이트에 CSRF 토큰 보호를 구현했지만 토큰 값이 일관되지 않습니다. HTML 양식에 존재합니다. 특히 "연락처" 및 AJAX 양식에서 이 문제가 나타납니다.

코드 검토

토큰:

PHP:

if (!isset($_SESSION)) {
    session_start();
    $_SESSION['formStarted'] = true;
}

if (!isset($_SESSION['token'])) {
    $token = md5(uniqid(rand(), TRUE));
    $_SESSION['token'] = $token;
}
로그인 후 복사

HTML:

<input type="hidden" name="token" value="<?php echo $token; ?>" />
로그인 후 복사

약점 해결

안타깝게도 현재 토큰 생성 방법은 결함이 있는 기술을 사용합니다.

  • rand()는 신뢰할 수 있는 임의성의 소스가 아닙니다.
  • uniqid()는 제한된 수의 엔트로피를 생성합니다.
  • md5 ()는 엔트로피에 기여하지 않고 오히려 순열합니다.

강력한 토큰 생성기 구현

양식을 보호하려면 다음 PHP 코드를 사용하세요.

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 (empty($_SESSION['token'])) {
    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 토큰의 유효성을 올바르게 검증하여 시도를 방지합니다. 악용:

if (!empty($_POST['token'])) {
    if (hash_equals($_SESSION['token'], $_POST['token'])) {
         // Proceed to process the form data
    } else {
         // Log this as a warning and monitor such attempts
    }
}
로그인 후 복사

추가 고려 사항

  • 보안 강화를 위해 각 양식에 맞는 CSRF 토큰을 만드는 것을 고려하세요.
  • 추가 보호를 위해 , Twig 템플릿 엔진을 활용하여 토큰 처리를 단순화하고 이를 템플릿.
  • 고유한 일회용 CSRF 토큰을 위해 Paragon Initiative Enterprises의 Anti-CSRF 라이브러리와 같은 전문 라이브러리의 사용을 살펴보세요.

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

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿