위조에 대한 $ _post 요청을 확보하기 위해 CSRF 토큰 구현
보안 CSRF 토큰을 생성하고 저장하십시오 : Random_Bytes ()를 사용하여 암호화 된 보안 토큰을 생성하고 세션 시작시 $ _session을 생성합니다. 2. XSS를 방지하기 위해 HTMLSpecialchars ()를 통해 토큰을 숨겨진 필드로 삽입하고 htmlspecialchars ()를 출력하십시오. 3. 처리 스크립트에서 Hash_equals ()를 사용하여 제출 된 토큰이 세션에 저장된 토큰과 일치하는지 확인하고 확인이 실패하면 403 오류가 반환됩니다. 4. 토큰은 민감한 작업 후에 무효화되고 재생되어야합니다. 5. 항상 HTTPS를 통해 전송하고 URL에 토큰 노출을 피하고 상태 변경에 Get을 사용하지 말고 Samesite = Strict 또는 Lax 세션 쿠키를 결합하여 보호를 향상시킵니다. 6. 쿠키에 토큰을 저장하거나 예측 가능한 임의의 기능을 사용하거나 특정 양식의 검증을 건너 뛰지 마십시오. CSRF 토큰의 올바른 구현은 크로스 사이트 요청 위조 공격을 효과적으로 방지하고 PHP 응용 프로그램의 사후 요청의 보안을 보장 할 수 있습니다.
CSRF (Cross-Site Request Grosery)는 악의적 인 웹 사이트, 이메일 또는 응용 프로그램이 사용자의 브라우저가 이미 인증 된 신뢰할 수있는 사이트에 원치 않는 요청을하는 것을 속이는 공격 유형입니다. 신청서가 확인없이 $ _post 요청을 처리하면 취약 해집니다. 가장 효과적이고 널리 채택 된 방어 중 하나는 CSRF 토큰을 구현하는 것입니다.

PHP 기반 애플리케이션을 보호하기 위해 CSRF 토큰을 올바르게 구현하는 방법은 다음과 같습니다.
CSRF 토큰이란 무엇입니까?
CSRF 토큰은 서버 측 애플리케이션에 의해 생성되어 클라이언트로 전송되는 독특하고 비밀이며 예측할 수없는 값입니다. 요청을 처리하기 전에 모든 상태 변경 요청 (양식 제출)에 포함되고 서버에서 검증되어야합니다.

아이디어는 간단합니다. 응용 프로그램에서 제공하는 페이지 만 올바른 토큰에 액세스 할 수 있습니다. 공격자는 XSS 취약점이 없다고 가정하거나 훔칠 수 없으므로 잊혀진 요청이 실패합니다.
단계별 구현
1. 세션 시작시 CSRF 토큰을 생성하십시오
먼저, 사용자에게 세션이 있는지 확인하십시오. 그런 다음 세션이 시작될 때 또는 양식이 표시 될 때 토큰을 생성하십시오.

session_start (); if (빈 ($ _ 세션 [ 'csrf_token'])) { $ _session [ 'csrf_token'] = bin2Hex (random_bytes (32)); }
이것은 암호적으로 안전한 임의의 토큰을 생성하고 세션에 저장합니다.
2. 양식에 토큰을 포함시킵니다
사후 요청을하는 모든 형태의 숨겨진 필드로 토큰을 추가하십시오.
<form method = "post"action = "process.php"> <입력 유형 = "hidden"name = "csrf_token"value = "<? php echo htmlspecialchars ($ _ session [ 'csrf_token']);?>"> <!-다른 형태의 필드-> <입력 유형 = "text"name = "username"> <버튼 유형 = "제출"> 제출 </button> </form>
htmlspecialchars()
사용하면 토큰을 출력 할 때 XSS 문제가 발생합니다.
3. 제출시 토큰을 검증하십시오
처리 스크립트 (예 : process.php
)에서 제출 된 토큰이 세션의 토큰과 일치하는지 확인하십시오.
session_start (); if ($ _server [ 'request_method'] === 'post') { if (! isset ($ _ post [ 'csrf_token']) ||! hash_equals ($ _ session [ 'csrf_token'], $ _post [ 'csrf_token]) { http_response_code (403); 다이 ( 'CSRF 토큰 검증 실패.'); } // 양식 데이터를 안전하게 처리합니다 $ username = trim ($ _ post [ 'username']); // ... 나머지 논리 }
-
hash_equals()
타이밍 공격을 방지하는 데 사용됩니다. - 민감한 동작 (비밀번호 변경)에 사용한 후에는 항상 토큰을 무효화하고 재생하십시오.
모범 사례
- HTTPS : CSRF 토큰은 항상 HTTP를 통해 전송되어 간섭을 방지해야합니다.
- 세션 당, 요청 당 : 특정 보안 요구 사항이없는 한 세션 당 하나의 토큰으로 충분합니다.
- 상태 변경 사항을 피하십시오 : GET 요청을 통해 데이터 삭제 또는 암호 변경과 같은 작업을 허용하지 마십시오.
- URL에 토큰을 노출시키지 마십시오 . 이로 인해 참조자 헤더 또는 브라우저 기록을 통해 누출 될 수 있습니다.
- Samesite 쿠키와 결합 : Session 쿠키를
SameSite=Lax
또는SameSite=Strict
.
예제 쿠키 설정 :
session_set_cookie_params ([ 'httponly'=> true, 'secure'=> true, 'samesite'=> '엄격한' ]);
토큰을 재생시킬 때
- 로그인 및 로그 아웃시.
- 권한 변경 후 (예 : 관리자 액세스 부여).
- 긴 세션 중에 주기적으로 (고 안전 보안 앱의 경우).
토큰이 누출되면 재생 토큰은 노출을 제한합니다.
일반적인 함정
- 쿠키에 토큰 저장 전용 : 이렇게하면 목적을 물리칩니다. 브라우저는 쿠키를 자동으로 보냅니다. 따라서 공격자는 여전히 요청을 트리거 할 수 있습니다.
- 예측 가능한 토큰 사용 :
time()
또는rand()
사용하지 마십시오 - 항상random_bytes()
또는openssl_random_pseudo_bytes()
사용하십시오. - 일부 양식에서 유효성 검사를 건너 뛰기 : 모든 상태를 변경하는 모든 요청을 보호해야합니다.
-
hash_equals()
사용하지 않음 : 표준 문자열 비교는 타이밍 공격에 취약 할 수 있습니다.
CSRF 토큰을 올바르게 구현하면 최소한의 오버 헤드로 강력한 보호 계층이 추가됩니다. 복잡하지는 않지만 일관성이 있어야합니다. 보안 세션 처리 및 입력 유효성 검사와 결합하면 $ _post 엔드 포인트가 위조 공격에 훨씬 더 탄력적입니다.
기본적으로 PHP의 양식 제출을 처리하고 CSRF 토큰을 사용하지 않는 경우 문을 열어두고 있습니다. 닫으십시오.
위 내용은 위조에 대한 $ _post 요청을 확보하기 위해 CSRF 토큰 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

핫 AI 도구

Undress AI Tool
무료로 이미지를 벗다

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

항상 $ _post 입력을 확인하고 청소하고, trim, filter_input 및 htmlspecialchars를 사용하여 데이터가 합법적이고 안전한 지 확인하십시오. 2. $ 오류 배열을 확인하여 명확한 사용자 피드백, 오류 메시지 표시 또는 성공 프롬프트를 제공합니다. 3. 일반적인 취약성을 방지하고 세션 토큰을 사용하여 CSRF 공격을 방지하고, 출력되지 않은 출력 및 SQL 주입을 피하십시오. 4. 사용자 경험을 향상시키기 위해 오류가 발생할 때 사용자가 제출 한 유효한 입력을 유지하십시오. 다음 단계를 따라 데이터 무결성과 사용자 친화 성을 보장하는 안전하고 신뢰할 수있는 PHP 양식 처리 시스템을 구축하십시오.

isset () isset () songeSollyForseCurePhpFormHandlingBecauseItOnlyCheckexExistence, notdatatype, format, orsafety; 2. AlwaysValidateInputusingFilter_Input () orfilter_var () witherfirdfilterskike -filter_validate_emailyecorrectformat;

PHP에서 $ _post 데이터가 사라지면 가장 먼저해야 할 일은 post_max_size 구성을 확인하는 것입니다. 이 설정은 PHP가 허용 할 수있는 최대 포스트 요청의 양을 정의합니다. 초과하면 $ _post 및 $ _files가 비어 있고 기본 오류 프롬프트가 없습니다. request_method가 post이고 $ _post가 비어 있고 content_length 및 post_max_size와 결합되어 있는지 확인하여 감지 할 수 있습니다. 많은 수의 입력 필드, 숨겨진 JSON, Base64 사진 또는 여러 파일 업로드 시나리오에서 일반적입니다. 이 솔루션에는 php.ini에서 Post_max_Size (예 : 32m)의 증가가 포함되며 UPLOAD_MA를 보장합니다.

파일 업로드를 처리하고 동시에 데이터를 양식하려면 게시물 메소드를 사용하고 ENCTYPE = "Multipart/Form-Data"를 설정해야합니다. 1. HTML 양식에 메소드 = "post"및 ENCTYPE = "multipart/form-data"가 포함되어 있는지 확인하십시오. 2. $ _post를 통해 제목 및 설명과 같은 텍스트 필드를 얻습니다. 3. $ _files를 통해 업로드 된 파일의 자세한 정보에 액세스하십시오. 4. 업로드가 성공했는지 확인하려면 $ _files [ 'Field'] [ 'Error']를 확인하십시오. 5. 불법 업로드를 방지하기 위해 파일 크기와 유형을 확인하십시오. 6. m을 사용하십시오

Filter_Input 함수를 사용하여 PHP에서 게시물 입력을 처리하십시오. $ _post의 직접적인 사용으로 인한 XSS 및 SQL 주입의 위험을 피하면서 보안 액세스 및 필터 검증을 동시에 구현할 수 있기 때문입니다. 1. filter_sanitize_full_special_chars를 사용하여 특수 문자 탈출을 위해 더 이상 사용되지 않은 filter_sanitize_string을 대체합니다. 2. 올바른 데이터 형식을 보장하려면 filter_validate_email 및 filter_validate_int를 사용하십시오. 3. 배열 또는 다중 필드는 캡슐화 기능을 통해 배치 처리 될 수 있습니다. 4. PHP8.1에서 시작하는 데주의를 기울이십시오

보안 CSRF 토큰을 생성하고 저장하십시오 : Random_Bytes ()를 사용하여 암호화 된 보안 토큰을 생성하고 세션 시작시 $ _session을 생성합니다. 2. XSS를 방지하기 위해 HTMLSpecialchars ()를 통해 토큰을 숨겨진 필드로 삽입하고 htmlspecialchars ()를 출력하십시오. 3. 처리 된 스크립트에서 Hash_equals ()를 사용하여 제출 된 토큰이 세션에 저장된 토큰과 일치하는지 확인하고 확인이 실패하면 403 오류가 반환됩니다. 4. 토큰은 민감한 작업 후에 무효화되고 재생되어야합니다. 5. 항상 HTTPS를 통해 전송하고 URL에 토큰 노출을 피하고 상태 변경에 Get을 사용하지 말고 Samesite = Strict 또는 Lax 세션 쿠키를 결합하십시오.

tobuildarobustrestfulphpapi, donotrelysolelyon $ _post, asitonlypopulatesswithform-encodedDataandnotjson; 2.checkthecontent-typehea dertodetermineiftheinputisjson, wathreadphp : // inputandanddecodeitusingjson_decode; 3.ifTeContentTypeisNotjson, fallbackto $ _postfor

$ _postdata.2.validateandsanitizeinpecearlyCeckingForRequiredFields, FilteringData, TrimmingLength, AndreectingUnexpectedCharacters.3.avoideRelyingOnmysqli_real_escape
