POST 파일에서 PHP 확장자를 사용한 위장 검사

5526 단어 PHP
안녕하세요!
고객측 POST의 파일에 대해서는 Direct Littlar Bar 대책 등 이외에도 주의해야 할 부분이 있는데, 이번에는'클라이언트 형식 POST의 파일 검증'에서'파일 확장자의 위장 검사'에 초점을 맞췄습니다!

그렇다면 확장자의 위장은 무엇일까.


mv sample.png sample.jpg
위에서 말한 바와 같이 내부 이진 변환 처리를 하지 않은 상태에서 확장자를 수정합니다.
단, 위의 파일을 Hex로 확인한 후

2진 헤더에 pg 파일을 확인할 수 있는 마술 번호가 있습니다!
  • 각종 파일의 마술 번호 목록
  • 그렇다면 이 파일 이름의 확장자가 jpg이고 내부가 pg인 파일을 클라이언트 측 형식으로POST를 진행한다면 PHP는 어떤 행동을 취할지 확인해 봅시다!

    확장자로 위장된 파일을 서버에서 확인


    먼저 다음 필드의 POST 파일을 사전 요구 사항으로 처리합니다.
    <input type="file" name="up-file">
    
    그때 POST가 했어sample.png を sample.jpg にリネームしたファイル.
    그리고 나서
    echo $_FILES["up-file"]["type"];
    
    그럼 MIME-Type으로
    image/jpeg
    
    확인할 수 있을 거예요.
    이것은 MIME-Type 일람 페이지에서 확인할 수 있는 것처럼 jpgファイル로 식별된 증거이다.
    그렇지만
    
    $f_info = finfo_open(FILEINFO_MIME_TYPE); 
    $mime = finfo_file(
        $f_info,
        $_FILES["up-file"]['tmp_name'] 
    );
    finfo_close($f_info); //念の為メモリ空間に開いたストリームの破棄を行う
    
    echo $mime;
    
    POST 파일의 바이너리에서 MIME-Type을 가져올 때
    
    image/png
    
    이렇게 하면 원래pngファイル였음을 확인할 수 있다.

    총결산

    $_FILES["識別子"]["type"]
    
    확인 가능한 MIME-Type은 파일 이름의 확장자로 추정됩니다!
    그래서
  • 파일 이름의 확장자로 추정되는 MIME-Type
  • 파일의 바이너리 헤더로 추정되는 MIME-Type
  • 의 일치 검사, 더욱 안전하게 파일 검증을 진행하고 싶다!
    다음은 샘플 코드입니다!
    
    $file = $_FILES["識別子"];
    
    $file_mime_type = $file["type"];
    
    $f_info = finfo_open(FILEINFO_MIME_TYPE);
    $binary_mime_type = finfo_file(
        $f_info,
        $file['tmp_name']
    );
    finfo_close($f_info);
    
    $is_same_mime_type = $file_mime_type === $binary_mime_type;
    
    감사합니다!!!!

    추기


    PHP에서 POST 파일의 Hex를 확인하는 방법입니다.

    
    $binary = file_get_contents(
        $_FILES["識別子"]["tmp_name"]
    );
    
    echo bin2hex($binary);
    
    Bin2hex(정확히 Binary to Hex)로 Binary 데이터를 Hex로 변환!
    위 코드의
    
    $_FILES["識別子"]["tmp_name"]
    
    에서 POST 파일의 임시(temporary) 경로를 문자열(String형)으로 저장하기 때문에 이진 데이터 처리로 file_get_contents합니다.
    그리고
  • 16진법으로 변환된 이진 헤더에 근거하여 확장명을 추측한다.인용하다
  • 확장자에서 MIME-Type으로 추정인용하다
  • 할 수 있다!

    좋은 웹페이지 즐겨찾기