sourcecode

PHP에서 업로드 형식의 파일 확장자 확인

codebag 2023. 8. 31. 23:51
반응형

PHP에서 업로드 형식의 파일 확장자 확인

나는 파일 확장자가 업로드되었는지 업로드되지 않았는지 확인합니다.예시적인 방법은 효과가 있었지만, 이제는 내 방법(사용)을 이해되어야 합니다.pathinfo)는 사실입니다.더 좋고 빠른 다른 방법이 있습니까?

$filename = $_FILES['video_file']['name'];
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if ($ext !== 'gif' || $ext !== 'png' || $ext !== 'jpg') {
    echo 'error';
}

사용.if( $ext !== 'gif')가 효율적이지 않을 수 있습니다.20개 정도의 다른 연장을 허용한다면요?

시도:

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

파일 확장명을 확인하는 것은 모범 사례로 간주되지 않습니다.이 작업을 수행하는 데 선호되는 방법은 파일 MIME 유형을 확인하는 것입니다.

PHP에서:

<?php
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // Return MIME type
    foreach (glob("*") as $filename) {
        echo finfo_file($finfo, $filename) . "\n";
    }
    finfo_close($finfo);
?>

위의 예는 확인해야 하는 것과 유사한 것을 출력합니다.

text/html
image/gif
application/vnd.ms-excel

MIME 유형을 속일 수도 있지만(파일의 처음 몇 바이트를 편집하고 마법 번호를 수정) 파일 이름을 편집하는 것보다 어렵습니다.따라서 해당 파일 유형이 실제로 무엇인지 100% 확신할 수 없으며 사용자가 업로드/이메일로 전송한 파일을 처리하는 데 주의해야 합니다.

개인적으로 preg_match() 함수를 사용하는 것을 선호합니다.

if(preg_match("/\.(gif|png|jpg)$/", $filename))

또는 in_array()

$exts = array('gif', 'png', 'jpg'); 
if(in_array(end(explode('.', $filename)), $exts)

와 함께in_array()검증 및 수행 질문에 대한 확장자가 많은 경우 유용할 수 있습니다.파일 이미지의 유효성을 검사하는 또 다른 방법:@imagecreatefrom*()기능이 실패하면 이미지가 유효하지 않음을 의미합니다.

예:

function testimage($path)
{
   if(!preg_match("/\.(png|jpg|gif)$/",$path,$ext)) return 0;
   $ret = null;
   switch($ext)
   {
       case 'png': $ret = @imagecreatefrompng($path); break;
       case 'jpeg': $ret = @imagecreatefromjpeg($path); break;
       // ...
       default: $ret = 0;
   }

   return $ret;
}

그러면:

$valid = testimage('foo.png');

라고 가정하면foo.png의 PHP 스크립트 파일입니다..png확장, 위의 기능이 실패합니다.셸 업데이트 및 LFI와 같은 공격을 피할 수 있습니다.

pathinfo는 멋지지만 코드를 개선할 수 있습니다.

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

물론 파일 이름의 확장자를 확인하는 것만으로는 파일 형식이 유효한 이미지로 보장되지 않습니다.다음과 같은 기능을 사용하는 것을 고려할 수 있습니다.getimagesize업로드된 이미지 파일의 유효성을 검사합니다.

파일 형식은 다른 방법으로도 확인할 수 있습니다.이게 업로드된 파일 종류를 확인하는 가장 쉬운 방법이라고 생각합니다.이미지 파일을 처리하는 경우 다음 코드로 이동합니다.만약 당신이 비디오 파일을 다루고 있다면, 이미지 체크를 if 블록의 비디오 체크로 대체하세요.즐겁게 보내세요

$img_up = $_FILES['video_file']['type'];
=으로 증가함 $img_up_type = img_up/, $img_up);
= $ $img_up_type_firstpart = $img_up_type[0];

img_up_type_firstpart == "image") { // image가 이미지 파일 형식이라면 비디오 파일 형식을 확인해야 할 경우 비디오를 처리할 수 있습니다.

논리 코드를 실행합니다 */}

이를 올바르게 수행하려면 MIME 유형을 확인하는 것이 좋습니다.

function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "shell_exec")) {
    // http://stackoverflow.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}
//pass the file name as
echo(get_mime($_FILES['file_name']['tmp_name']));

계산 시간이 더 빠를지는 모르겠지만 다른 옵션은...

$acceptedFormats = array('gif', 'png', 'jpg');

if(!in_array(pathinfo($filename, PATHINFO_EXTENSION), $acceptedFormats))) {
    echo 'error';
}

이것이 당신에게 효과가 있을 것이라고 생각합니다.

//<?php
    //checks file extension for images only
    $allowed =  array('gif','png' ,'jpg');
    $file = $_FILES['file']['name'];
    $ext = pathinfo($file, PATHINFO_EXTENSION);
        if(!in_array($ext,$allowed) ) 
            { 
//?>
<script>
       alert('file extension not allowed');
       window.location.href='some_link.php?file_type_not_allowed_error';
</script>

//<?php
exit(0);
    }
//?>

업로드하기 전에 양식에서 파일 확장명(jpg/jpeg만 해당)의 유효성을 검사하는 방법.다른 게시된 양식 값을 평가할 때 유용할 수 있는 데이터 필터가 포함된 다른 게시된 답변의 변형입니다.참고: 사용자가 요구사항이 아닌 선택사항이었기 때문에 비어 있으면 오류가 비어 있습니다.

<?php
if(isset($_POST['save'])) {

//Validate image
if (empty($_POST["image"])) {
$imageError = "";
} else {
$image = test_input($_POST["image"]);
$allowed =  array('jpeg','jpg');
$ext = pathinfo($image, PATHINFO_EXTENSION);
if(!in_array($ext,$allowed) ) {
$imageError = "jpeg only";
}
}

}

// Validate data
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
<?

HTML은 다음과 같이 나타납니다.

<html>
<head>
</head>

<body>
<!-- Validate -->
<?php include_once ('validate.php'); ?>

<!-- Form -->
<form method="post" action="">

<!-- Image -->
<p>Image <?php echo $imageError; ?></p>
<input type="file" name="image" value="<?php echo $image; ?>" />

<p><input type="submit" name="save" value="SAVE" /></p>
</form>

</body>
</html>

이 함수를 사용합니다.

 function check_image_extension($image){

        $images_extentions = array("jpg","JPG","jpeg","JPEG","png","PNG");

        $image_parts = explode(".",$image);

        $image_end_part = end($image_parts);

        if(in_array($image_end_part,$images_extentions ) == true){

            return time() . "." . $image_end_part;


        }else{

            return false;
        }


    }

언급URL : https://stackoverflow.com/questions/10456113/check-file-extension-in-upload-form-in-php

반응형