복붙노트

PHP에서 업로드 된 파일 형식을 확인하는 방법

PHP

PHP에서 업로드 된 파일 형식을 확인하는 방법

이 코드를 사용하여 이미지 유형을 확인했습니다.

$f_type=$_FILES['fupload']['type'];

if ($f_type== "image/gif" OR $f_type== "image/png" OR $f_type== "image/jpeg" OR $f_type== "image/JPEG" OR $f_type== "image/PNG" OR $f_type== "image/GIF")
{
    $error=False;
}
else
{
    $error=True;
}

일부 사용자는 어떤 유형의 이미지를 업로드하는 동안 오류가 발생하는 반면 일부 사용자는 오류가 발생하지 않는다고 불평합니다!

이 문제가 해결되는지 궁금 해서요 :

if (mime_content_type ($ _ FILES [ 'fupload'] [ 'type']) == "image / gif") {...

다른하실 말씀 있나요?

해결법

  1. ==============================

    1.$ _FILES .. [ 'type']을 사용하지 마십시오. 여기에 포함 된 정보는 전혀 검증되지 않으며 사용자 정의 값입니다. 직접 유형을 테스트하십시오. 이미지의 경우 보통 exif_imagetype이 좋은 선택입니다.

    $ _FILES .. [ 'type']을 사용하지 마십시오. 여기에 포함 된 정보는 전혀 검증되지 않으며 사용자 정의 값입니다. 직접 유형을 테스트하십시오. 이미지의 경우 보통 exif_imagetype이 좋은 선택입니다.

    $allowedTypes = array(IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_GIF);
    $detectedType = exif_imagetype($_FILES['fupload']['tmp_name']);
    $error = !in_array($detectedType, $allowedTypes);
    

    또는 서버가 지원하는 경우 finfo 함수가 유용합니다.

  2. ==============================

    2.@deceze 외에도 finfo ()를 사용하여 비 이미지 파일의 MIME 유형을 확인할 수 있습니다.

    @deceze 외에도 finfo ()를 사용하여 비 이미지 파일의 MIME 유형을 확인할 수 있습니다.

    $finfo = new finfo();
    $fileMimeType = $finfo->file($path . $filename, FILEINFO_MIME_TYPE);
    
  3. ==============================

    3.물론 exif를 사용하여 이미지인지 확인할 수는 있지만 finfo와 같이하는 것이 더 좋습니다.

    물론 exif를 사용하여 이미지인지 확인할 수는 있지만 finfo와 같이하는 것이 더 좋습니다.

    $allowed_types = array ( 'application/pdf', 'image/jpeg', 'image/png' );
    $fileInfo = finfo_open(FILEINFO_MIME_TYPE);
    $detected_type = finfo_file( $fileInfo, $_FILES['datei']['tmp_name'] );
    if ( !in_array($detected_type, $allowed_types) ) {
        die ( 'Please upload a pdf or an image ' );
    }
    finfo_close( $fileInfo );
    
  4. ==============================

    4.내 생각에 가장 좋은 방법은 imagecreatefromstring () 다음에 getimagesize ()를 먼저 사용하는 것입니다.

    내 생각에 가장 좋은 방법은 imagecreatefromstring () 다음에 getimagesize ()를 먼저 사용하는 것입니다.

        $size = getimagesize($filename);
        if ($size === false) {
            throw new Exception("{$filename}: Invalid image.");
        }
        if ($size[0] > 2500 || $size[1] > 2500) {
            throw new Exception("{$filename}: Image too large.");
        }
    
        if (!$img = @imagecreatefromstring(file_get_contents($filename))) {
            throw new Exception("{$filename}: Invalid image content.");
        }
    

    getimagesize ()를 통해 확인하면 일부 DoS 공격을 방지합니다. 이미지 파일이 아닌 파일이나 너무 큰 파일을 사용자가 제공하는 모든 파일에서 imagecreatefromstring () 할 필요가 없기 때문입니다. 불행히도, PHP 문서에 따르면 이미지 형식의 콘텐츠를 확인하기 위해 의존 수 없습니다.

    imagecreatefromstring ()은 마침내 파일을 이미지로 열려고 시도합니다. 성공하면 이미지가 있습니다.

  5. ==============================

    5.PHP 5.5에서는이 함수를 사용하여 파일 유형을 가져오고 이미지가 있는지 확인합니다.

    PHP 5.5에서는이 함수를 사용하여 파일 유형을 가져오고 이미지가 있는지 확인합니다.

    function getFileType( $file ) {
        return image_type_to_mime_type( exif_imagetype( $file ) );
    }
    
    // Get file type
    $file_type = getFileType( 'path/to/images/test.png' );
    echo $file_type;
    // Prints image/png
    // 1. All images have mime type starting with "image"
    // 2. No other non-image mime types contain string "image" in it 
    

    그럼 당신은 할 수 :

    if ( strpos( $filetype, 'image' ) !== false ) {
        // This is an image 
    }
    

    마임 유형의 전체 목록 : http://www.sitepoint.com/web-foundations/mime-types-complete-list/

  6. ==============================

    6.이것은 자주 사용하는 단순하고 한 줄짜리 스크립트입니다.

    이것은 자주 사용하는 단순하고 한 줄짜리 스크립트입니다.

    $image = "/var/www/Core/temp/image.jpg";
    $isImage = explode("/", mime_content_type())[0] == "image";
    

    기본적으로 mime_content_type ()을 사용하여 "image / jpg"와 같은 것을 얻은 다음 "/"로 분해하고 배열의 첫 번째 요소를 검사하여 "image"가 표시되는지 확인합니다.

    나는 그것이 일하기를 바란다!

  7. ==============================

    7.그 마지막 줄은 가깝습니다. 당신이 사용할 수있는: if (mime_content_type ($ _ FILES [ 'fupload'] [ 'tmp_name']) == "image / gif") {...

    그 마지막 줄은 가깝습니다. 당신이 사용할 수있는: if (mime_content_type ($ _ FILES [ 'fupload'] [ 'tmp_name']) == "image / gif") {...

    현재 작업하고있는 경우 mime_content_type () 및 finfo () (다른 사용자가 제안한)가 "text / plain"을보고하는 동안 my $ _FILES .. [ 'type']은 자체를 "text / csv"로보고합니다. . @deceze가 지적했듯이 $ _FILES .. [ 'type']은 클라이언트가 파일을 어떤 유형으로 생각하는지 알기 위해서만 유용합니다.

  8. ==============================

    8.경고 : 다음 답변은 실제로 파일 형식을 확인하지 않습니다. 이름 만 검사합니다. 실제 보안 목적으로는 적합하지 않습니다.

    경고 : 다음 답변은 실제로 파일 형식을 확인하지 않습니다. 이름 만 검사합니다. 실제 보안 목적으로는 적합하지 않습니다.

    편집 : 보안 검사를 제공하지 않으므로이 방법을 사용하지 마십시오. 나는 아무도 이처럼 똑같은 실수를하지 않도록이 대답을 남겨두고있다.

    나는 다음을 시도했고 그것은 나를 위해 일했다.

    $allowed =  array('gif','png' ,'jpg', 'pdf');
    $filename = $_FILES['input_tag_name']['name'];
    $ext = pathinfo($filename, PATHINFO_EXTENSION);
    if(!in_array($ext,$allowed) ) {
        echo 'error';
    }
    

    소스 링크

  9. from https://stackoverflow.com/questions/6755192/how-to-check-uploaded-file-type-in-php by cc-by-sa and MIT license