2016-08-30 5 views
0

이 PHP 코드를 도와 주시면 기쁘게 생각합니다.파일 형식을 확인하려고 시도했습니다.

.pdf, .docx.rtf 개의 파일 만 지원하는 업로드 양식을 만들었습니다. 파일이 업로드되지만 파일 형식이 pdf, docx 또는 rtl인지 또는 그 중 파일 종류가 아닌지 여부를 확인할 수 없습니다. 이 문제를 해결할 수있는 해결책은 무엇입니까?

잘 내가 stackoverflow에서 몇 가지 검색을했는데, 회원 중 일부는 내가 한 것처럼 똑같은 짓을했으나 여전히 작동하지 않습니다. 이 코드는 입력에서 파일을 가져옵니다. 파일을 특정 폴더의 서버에 업로드 한 다음 파일 이름을 데이터베이스에 저장합니다. 여기

<?php 
 
    function query($q) 
 
    { 
 
    $dbconnection = mysql_connect('127.0.0.1' , 'root' , ''); 
 
    $database = mysql_select_db('hire_requests'); 
 
    mysql_set_charset("utf8",$dbconnection); 
 
    $res = mysql_query($q,$dbconnection); 
 
    mysql_close($dbconnection); 
 
    return $res; 
 
    } 
 
    function test_input($data) 
 
    { 
 
    $data = trim($data); 
 
    $data = stripslashes($data); 
 
    $data = htmlspecialchars($data); 
 
    return $data; 
 
    } 
 
    $error = ''; 
 
    $alarm = false; 
 
    $success = false; 
 
    $changedname = ''; 
 
    $name = ''; 
 
    $lastname = ''; 
 
    $phonenumber; 
 
    $nnumber; 
 
    $type =''; 
 
    $mail = ''; 
 
    $resume; 
 
    $type = ''; 
 
    $notify = ''; 
 
    $nameErr= ""; 
 
    $mailErr = ""; 
 
    $resumeErr = ""; 
 
    $nnumberErr = ""; 
 
    $lastnameErr = ""; 
 
    $phonenumberErr = ""; 
 
    $notsentErr = ""; 
 
    $sizeErr = ""; 
 
    if($_SERVER['REQUEST_METHOD'] == 'POST') 
 
    { 
 
    $name = mysql_real_escape_string($_POST['name']); 
 
    $lastname = mysql_real_escape_string($_POST['lastname']); 
 
    $phonenumber = mysql_real_escape_string($_POST['phonenumber']); 
 
    $nnumber = mysql_real_escape_string($_POST['nnumber']); 
 
    $mail = mysql_real_escape_string($_POST['mail']); 
 
    if(isset($_FILES['resume'])) 
 
    { 
 
     $filename = $_FILES['resume']['name']; 
 
     $filesize = $_FILES['resume']['size']; 
 
     $filetype = $_FILES['resume']['type']; 
 
     $filetmp = $_FILES['resume']['tmp_name']; 
 
     if($_FILES['resume']['error'] !== 0) 
 
     { 
 
     $alarm = true; 
 
     } 
 
     $AllowedTypesArray = array('docx' , 'rtf' , 'pdf'); 
 
     $changedname = 'Rayka_' . rand(1000,9000) . '_' . '5SV4DFS_A245DFA' . '_' . time() . '_' . $name; 
 
     $info = pathinfo($filename , PATHINFO_EXTENSION); 
 

 
     if($alarm = true) 
 
     { 
 

 
     } 
 
     if($filetype == 'application/pdf') 
 
     { 
 
     $type = '.pdf'; 
 
     } 
 
     if($filetype == 'application/msword') 
 
     { 
 
     $type = '.docx'; 
 
     } 
 
     if($filetype == 'application/rtf') 
 
     { 
 
     $type = '.rtf'; 
 
     } 
 
     if(!$type) 
 
     { 
 
     $resumeErr = "file's type is not supported"; 
 
     } 
 
     if(!in_array($info , $AllowedTypesArray)) //checks if filetype is pdf , rtl or docx and also , checks if the file is less than 2 mbs or not . 
 
     { 
 
     $error = "file's type is not supported"; 
 
     $alarm = true; 
 
     } 
 
     if($filesize > 2097152) 
 
     { 
 
     $sizeErr ="Your file must be less than 2 Mbs"; 
 
     } 
 
     $path = dirname(__FILE__).'/_ufile/'.$changedname . $type; 
 
     var_dump($path); 
 
    if(!move_uploaded_file($_FILES['resume']['tmp_name'] , $path)) 
 
     { 
 
     $alarm = true; 
 
     $notsentErr = 'File was not sent'; 
 
     } 
 
    } 
 
    if(!isset($_FILES['resume'])) 
 
    { 
 
     $resumeErr = 'attachment is not chosen'; 
 
     $alarm = true; 
 
    } 
 
      if($_SERVER['REQUEST_METHOD'] == 'POST') 
 
      { 
 
       if (empty($_POST["name"])) 
 
       { 
 
        $nameErr = "Enter your name"; 
 
       } 
 
       else 
 
       { 
 
        $name = test_input($_POST["name"]); 
 
       } 
 
      } 
 
      if(empty($_POST['lastname'])) 
 
      { 
 
       $lastnameErr = "Enter your last name"; 
 
      } 
 
      else { 
 
       $lastname = test_input($_POST['lastname']); 
 
      } 
 
      if(empty($_POST['phonenumber'])) 
 
      { 
 
       $phonenumberErr = "Enter your phone number"; 
 
      } 
 
      else 
 
      { 
 
       $phonenumber = test_input($_POST['phonenumber']); 
 
      } 
 
      if(empty($_POST['nnumber'])) 
 
      { 
 
       $nnumberErr = "Enter your second phone number"; 
 
      } 
 
      else 
 
      { 
 
       $nnumber = test_input($_POST['nnumber']); 
 
      } 
 
      if(empty($_POST['mail'])) 
 
      { 
 
       $mailErr = "enter your email address"; 
 
      } 
 
      else 
 
      { 
 
       $mail = test_input($_POST['mail']); 
 
      } 
 
      if((!$nameErr) && (!$lastnameErr) && (!$mailErr) && (!$phonenumberErr) && (!$nnumberErr) && (!$notsentErr) && (!$sizeErr)) 
 
      { 
 

 
      $query = "INSERT INTO users (`id`,`name`, `lastname`, `phonenumber`, `nnumber`, `mail`, `resume`) VALUES (NULL , \"$name\",\"$lastname\",\"$phonenumber\",\"$nnumber\",\"$mail\",\"$changedname\")"; 
 
      $notify = "Successful"; 
 
      $success = true; 
 
      $insert = query($query); 
 
      $error2 = mysql_error(); 
 
      } 
 
    } 
 
    ?>

+0

이것은 당신이 전체 스크립트가 될 수 없습니다 사용?! $ filetype에 무엇이 있습니까? – Naruto

+0

그래, 실제로 그것의 일부. filetype은 실제로 다음과 같습니다. $ filetype = $ _FILES [ 'resume'] [ 'type']; –

+0

글쎄, 나는 전체 스크립트를 게시 할 것이다. –

답변

1

은 내가 사용하는 (내가 당신을 위해 변경 필요) : 여기

$finfo = finfo_open(FILEINFO_MIME_TYPE); 
$mime = finfo_file($finfo, $_FILES['resume']['tmp_name']); 
$ok = false; 
switch ($mime) { 
    case 'application/pdf': 
    case 'application/msword': 
    case 'text/pdf': 
    case 'application/rtf': 
    case 'application/x-rtf': 
    case 'text/richtext': 
    case 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 
     $ok = true; 
     break; 
    default: 
     die(); 
} 

전체 MIME 타입 목록 : https://www.sitepoint.com/web-foundations/mime-types-complete-list/

+0

이것은 제가 따라갈 접근법입니다. 그러나 경고의 아주 중요한 단어 : MIME 형식은 파일이 주장하는 바를 증명하지 못합니다. 나는 영어 임에도 불구하고 프랑스어로 말할 수 있습니다. 보안 컨텍스트에서 MIME이 올바른 것으로 가정하지 마십시오. PDF 및 docx 파일은 악의적 인 페이로드에 대해 더 일반적으로 공격되는 형식 중 두 가지입니다. 따라서 MIME 검사 외에 바이러스 검사 및/또는 이미지 등으로의 변환을 적극 권장합니다. – wally

+0

시간을내어 주셔서 감사합니다. MaximeK. 나는 die(); 나머지 코드는 실행되지 않습니다. –

+0

@SinaR - http://php.net/manual/en/function.die.php 및 http://php.net/manual/en/function.finfo-file.php – wally

관련 문제