목차
Null 바이트는 무엇이며 왜 중요합니까?
함정 #1 : 파일 작업에서 예상치 못한 잘림
함정 #2 : 파일 업로드의 보안 위험
함정 #3 : strcmp 및 문자열 비교 문제
함정 #4 : 정기적 인 표현의 오작동
일반적인 모범 사례
백엔드 개발 PHP 튜토리얼 PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결

PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결

Jul 28, 2025 am 04:42 AM
PHP Strings

NULL 바이트 (\ 0)는 C 확장 또는 시스템 호출과 인터페이스 할 때 PHP \ 0이 문자열 터미네이터로 취급되기 때문에 PHP에서 예상치 못한 동작을 유발할 수 있습니다. 2. 파일 작업에서 "config.txt \ 0.php.bak"과 같은 NULL 바이트를 포함하는 파일 이름은 "config.txt"로 잘려서 파일 액세스 또는 보안 위험이 잘못 초래 될 수 있습니다. 3. 파일 업로드 중에 공격자는 $ _post [ 'filename']에서 null 바이트를 이용하여 확장 검사를 우회하여 "shell.php \ 0.jpg" "shell.php"로 저장됩니다. 4. 순수한 PHP (===, strcmp)의 문자열 비교는 널 바이트를 올바르게 처리하지만 C 기반 확장자 또는 데이터베이스 드라이버는 문자열을 자르고 데이터 무결성을 위험에 빠뜨릴 수 있습니다. 5. 정규 표현식은 \ a 및 \ z로 올바르게 고정되지 않는 한 늘색 바이트와 부분적으로 일치 할 수 있으므로 처리 전에 입력을 \ 0에 대해 확인해야합니다. 6. 모범 사례에는 str_replace ( "\ 0", '', $ input)를 사용하여 널 바이트 필터링 또는 basename (), realpath () 및 filter_input ()을 사용하여 거부하고, 모든 사용자 입력 ()를 사용하여 시스템 호출 또는 SQL에서 직접 문자열 보간을 피하고 데이터베이스 queries에 대한 준비된 문을 사용하여 안전을 보장합니다. 항상 널 바이트를 잠재적으로 위험한 입력으로 취급하고 잘라 내고 보안 취약점을 방지하기 위해 명시 적으로 처리하십시오.

PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결

PHP에서 문자열로 작업하는 것은 일반적으로 널 바이트 ( \0 )와 문자열 종료 와 관련된 에지 케이스가 발생할 때, 특히 C 확장, 파일 작업 또는 사용자 입력과 인터페이스 할 때 간단합니다. PHP는 낮은 수준의 언어보다 문자열을 더 유연하게 처리하지만 이러한 문제는 여전히 예기치 않은 동작, 보안 취약점 또는 데이터 자료로 이어질 수 있습니다. 가장 일반적인 함정을 이해하고 피하는 방법은 다음과 같습니다.

PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결

Null 바이트는 무엇이며 왜 중요합니까?

Null Byte ( \0 )는 ASCII 값이 0 인 문자입니다. C 스타일 문자열에서는 문자열의 끝을 표시합니다. 그러나, PHP 스트링은 이진-안전 이며, 이는 널 바이트를 포함하고 여전히 전체 길이를 보존 할 수 있음을 의미합니다. PHP가 \0 터미네이터로 해석 하는 연장 또는 시스템 호출의 기능 (예 : 확장 또는 시스템 호출과 같은)을 통과 할 때 문제가 발생합니다.

예를 들어:

PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결
 $ string = "hello \ 0world";
echo strlen ($ string); // 출력 : 11

Null 바이트가 있어도 PHP는 문자열의 길이가 11 자라는 것을 알고 있습니다. 그러나이 문자열이 널리 터진 문자열을 기대하는 C 함수로 전달되면 "hello" 만 나타납니다.


함정 #1 : 파일 작업에서 예상치 못한 잘림

가장 일반적인 문제 중 하나는 file_get_contents() 또는 fopen() 과 같은 함수를 파일 이름 또는 널 바이트를 포함하는 경로와 함께 사용할 때 발생합니다.

PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결
 $ filename = "config.txt \ 0.php.bak";
file_get_contents ($ filename); // "config.txt"만 읽을 수 있습니다.

PHP는 문자열을 통과 할 수 있지만 기본 시스템 호출 (C로 작성된)은 \0 에서 중지되며 잠재적으로 다음으로 이어집니다.

  • 잘못된 파일을 읽습니다
  • 파일 확장 우회 (파일 업로드의 보안 위험)

솔루션 : 항상 입력을 소독하고 검증하십시오.

 if (strpos ($ filename, "\ 0")! == false) {
    새로운 invalidargumentexception을 던지십시오 ( "Null 바이트는 파일 이름에서 허용되지 않습니다");
}

더 좋은 점은 파일 작업에 화이트리스트를 사용하고 가능하면 동적 파일 이름을 피하십시오.


함정 #2 : 파일 업로드의 보안 위험

공격자는 NULL 바이트를 $_GET , $_POST 에 주입하거나 파일 이름을 업로드하여 문자열 종료 동작을 이용할 수 있습니다.

위험한 패턴의 예 :

 // 이것을하지 마십시오
$ uploaddir = '/uploads/';
move_uploaded_file ($ _ files [ 'file'] [ 'tmp_name'], $ uploaddir. $ _post [ 'filename']);

$_POST['filename']"shell.php\0.jpg" 인 경우 일부 시스템은 shell.php 로 저장할 수 있습니다 ( \0 이후 .jpg 가 무시되기 때문에).

솔루션 :

  • 파일 경로에 대한 사용자 입력을 절대 신뢰하지 마십시오
  • basename() 사용하여 디렉토리 정보를 제거하십시오
  • 이름뿐만 아니라 실제 파일 컨텐츠의 확장자 검증
  • NULL 바이트 필터를 명시 적으로 :
     if (preg_match ( '/[\ x00]/', $ filename) {
      다이 ( "유효하지 않은 파일 이름");
    }

함정 #3 : strcmp 및 문자열 비교 문제

PHP의 기본 문자열 비교 ( == , === , strcmp )는 널 바이트를 올바르게 처리하지만 C 스트링에 의존하는 확장자 또는 데이터베이스 드라이버를 사용할 때 문제가 발생할 수 있습니다.

예를 들어, php에서 "admin\0""admin" 비교 :

 var_dump ( "admin \ 0"=== "admin"); // 거짓
var_dump (strcmp ( "admin \ 0", "admin"); // 0이 아닌 (동일하지 않음)

이것은 순수한 PHP에서 안전하지만, 이러한 문자열이 C 기반 드라이버를 통해 SQL 쿼리에 사용되면 잘린 것이 발생할 수 있습니다.

모범 사례 : 준비된 진술을 사용하여 주입을 피하고 데이터 무결성을 보장하십시오.

 $ stmt = $ pdo-> 준비 ( "사용자 이름 =?");
$ stmt-> execute ([$ username]); // PDO는 탈출 및 이진 데이터를 처리합니다

함정 #4 : 정기적 인 표현의 오작동

PHP의 PCRE 기능은 일반적으로 이진-안전이지만, 널 바이트는 특히 사용자 입력을 처리 할 때 여전히 혼란을 유발할 수 있습니다.

예:

 preg_match ( '/^[\ w \.] $/', "file.txt \ 0.php"); // 반환 할 수 있습니다 1 (!)

Regex는 Null 바이트까지 일치하지만 전체 문자열은 안전하지 않습니다.

수정 사항 : Regex 전에 Null 바이트를 명시 적으로 거부합니다.

 if (strpos ($ input, "\ 0")! == false) {
    // 거부 또는 처리
}

또는 \A\z (절대 시작/종료)와 함께 더 엄격한 패턴을 사용하십시오.

 preg_match ( '/\ a [\ w \.] \ z/', $ input); // 전체 문자열 일치를 보장합니다

일반적인 모범 사례

PHP의 무효 바이트 함정을 피하려면 :

  • ✅ 사용자 입력에서 널 바이트 필터 :
     $ clean = str_replace ( "\ 0", '', $ input); // 또는 완전히 거부하십시오
  • basename() , realpath()filter_input() 과 같은 내장 기능을 사용합니다.
  • ✅ 모든 외부 데이터를 확인하고 살균하는 것 - 안전하다고 가정합니다.
  • system 시스템 호출 또는 SQL에서 직접 문자열 보간을 피하십시오 .
  • maw 데이터를 처리 할 때 이진 안전 기능을 사용하십시오

  • Null 바이트는 본질적으로 사악하지는 않지만 PHP의 높은 수준의 문자열 처리와 C의 저수준 세계 사이의 간격을 드러냅니다. 입력을 조기에 검증하고 문자열이 어디로 가는지 이해함으로써 잘림, 보안 결함 및 두통을 피할 수 있습니다.

    기본적으로 : 널 바이트를 다른 위험한 입력처럼 취급하여 필터링하거나 명시 적으로 처리하십시오.

    위 내용은 PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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

핫 AI 도구

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

AI 옷 제거제

Video Face Swap

Video Face Swap

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

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

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

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

방어 문자열 처리 : PHP의 XSS 및 주입 공격 방지 방어 문자열 처리 : PHP의 XSS 및 주입 공격 방지 Jul 25, 2025 pm 06:03 PM

todefendagainstxssandinjectioninphp : 1. AlwaysCapeOutPutUsingHtMlSpecialChars () forHtml, json_encode () forjavaScript, andurlenCode () forurls, validateAndSanitizeInItizeInSanitizeInPeaceAryLter_Ar (), 적용과 관련하여

`sprintf` 및`vsprintf`가있는 고급 문자열 서식 기술 `sprintf` 및`vsprintf`가있는 고급 문자열 서식 기술 Jul 27, 2025 am 04:29 AM

Sprintf 및 vsprintf는 PHP에서 고급 문자열 형식 기능을 제공합니다. 답은 다음과 같습니다. 1. 부동 소수점 정확도와 %d는 %.2F를 통해 제어 될 수 있고, 정수 유형은 d로 보장 될 수 있고, d로 제로 패딩을 달성 할 수 있습니다. 2. 가변 위치는 %1 $ S 및 %2 $ D와 같은 위치 자리 표시자를 사용하여 고정 될 수 있으며, 이는 국제화에 편리합니다. 3. 왼쪽 정렬 및] 오른쪽 정렬은 %-10을 통해 달성 될 수 있으며, 이는 테이블 또는 로그 출력에 적합합니다. 4. vsprintf는 배열 매개 변수를 지원하여 SQL 또는 메시지 템플릿의 동적 생성을 용이하게합니다. 5. 원래 이름 자리 표시자가 없지만 {name} 구문은 일반 콜백 함수를 통해 시뮬레이션 할 수 있거나, extract ()와 함께 연관 배열을 사용할 수 있습니다. 6. substr_co

JSON 이외 : PHP의 기본 문자열 직렬화 이해 JSON 이외 : PHP의 기본 문자열 직렬화 이해 Jul 25, 2025 pm 05:58 PM

PHP의 기본 직렬화는 JSON보다 PHP의 내부 데이터 저장 및 전송에 더 적합합니다. 1. int, float, bool 등의 완전한 데이터 유형을 유지할 수 있기 때문에 1. 2. 개인 및 보호 된 객체 속성을 지원합니다. 3. 재귀 참조를 안전하게 처리 할 수 있습니다. 4. 사막화 동안 수동 유형 변환이 필요하지 않습니다. 5. 일반적으로 성능에서 JSON보다 낫습니다. 그러나 교차 언어 시나리오에서 사용해서는 안되며, 원격 코드 실행 공격을 유발하지 않도록 신뢰할 수없는 입력을 요구하지 않아야합니다. PHP 환경으로 제한되어 있고 고 충실도 데이터가 필요할 때 사용하는 것이 좋습니다.

이진 데이터 포장 풀기 : PHP의`pack ()`및`unpack ()`에 대한 실용 가이드 이진 데이터 포장 풀기 : PHP의`pack ()`및`unpack ()`에 대한 실용 가이드 Jul 25, 2025 pm 05:59 PM

PHP의 Pack () 및 Unpack () 함수는 PHP 변수와 이진 데이터간에 변환하는 데 사용됩니다. 1.pack ()는 정수 및 문자열과 같은 변수를 이진 데이터로 패키지하고 포장을 풀면 이진 데이터를 PHP 변수로 포장 해제합니다. 둘 다 전환 규칙을 지정하기 위해 형식 문자열에 의존합니다. 2. 일반적인 형식 코드에는 C/C (/Unsigned char 대도시 (네트워크 표준). v 플랫폼에서 통신 할 때는 먼저 사용해야합니다.

문자 수준의 문자열 조작 및 성능 영향 문자 수준의 문자열 조작 및 성능 영향 Jul 26, 2025 am 09:40 AM

캐릭터 수준의 관리자는 캔더 링크를 제공합니다

PHP의 대형 데이터 세트에 대한 메모리 효율적인 문자열 처리 PHP의 대형 데이터 세트에 대한 메모리 효율적인 문자열 처리 Jul 26, 2025 am 09:42 AM

processlargefilesline-lineorinchunksusingfgets () orfread () 대신 Orfile_get_contents ()

PHP 스트링 인코딩의 미로 탐색 : UTF-8 이상 PHP 스트링 인코딩의 미로 탐색 : UTF-8 이상 Jul 26, 2025 am 09:44 AM

PHP가 기본적으로 유니 코드를 지원하지 않기 때문에 UTF-8 처리는 PHP에서 수동으로 관리되어야합니다. 1. MBString 확장자를 사용하여 MB_Strlen, MB_SUBSTR와 같은 다중 바이트 보안 기능을 제공하고 UTF-8 인코딩을 명시 적으로 지정합니다. 2. 데이터베이스 연결이 UTF8MB4 문자 세트를 사용하는지 확인하십시오. 3. HTTP 헤더 및 HTML 메타 태그를 통해 UTF-8을 선언합니다. 4. 파일 읽기 및 쓰기 중에 인코딩을 확인하고 변환합니다. 5. JSON 처리 전에 데이터가 UTF-8인지 확인하십시오. 6. 감지 및 변환을 인코딩하기 위해 MB_DETECT_ENCODING 및 ICONV를 사용하십시오. 7. 데이터 손상을 방지하는 것이 수리 후보다 낫고, Code 문제를 피하기 위해 모든 수준에서 UTF-8을 사용해야합니다.

PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결 PHP에서 널 바이트 및 문자열 종료로 일반적인 함정 해결 Jul 28, 2025 am 04:42 AM

nullbytes (\ 0) cancauseOnexpectedBehaviorInphppwhenInterfacingwithCextensionsOrsystemCallsBecaUcaUcaUcaUsctreats \ 0ASASTRINGTERTIMINATOR, eventHoughprsTringsArgebinary-safeAndPreserve Serveyfulllleng.2.infileOperations, filenamescontainingnullbytes

See all articles