2012-10-12 71 views
0

可能重复:
How can I only allow certain filetypes on upload in php?只允许jpg和.png文件只

我怎样才能让下面仅脚本允许.jpg图像或.png图像? 它根据会话用户名匹配将图像目录上传到mysql表。是否可以限制文件类型?因为我只需要.jpg或.png

if ($_POST['submit']) { 
    //get file attributes 

    $Name = $_FILES['myfile']['name']; 
    $tmp_name = $_FILES['myfile']['tmp_name']; 
    error_reporting(E_ERROR | E_PARSE); 

    if ($Name) {    
    $location = "avatars/$Name";  
    move_uploaded_file($tmp_name, $location) or die('Failed to upload picture'); 
    $query = mysql_query("UPDATE fgusers3 SET imagelocation='$location' WHERE name='$name'") or die("Your profile image has been uploaded!"); 

    }} 



echo "Upload your image below: 
    <form action='profilepic.php' method='POST' enctype='multipart/form-data'> 
    Profile Picture: <input type='file' name='myfile'> <input type='submit' name='submit' value='upload'> 
    </form>"; 
+0

请注意有几种方法来欺骗扩展,MIME类型等。处理上传的文件时请注意这一事实。 –

回答

1

您可以尝试使用pathinfo & exif_imagetype

if(pathinfo($Name,PATHINFO_EXTENSION) != "jpg" || exif_imagetype($Name) != IMAGETYPE_JPEG) 
{ 
    // throw error 
} 

See More Info to detect Fake Images

+1

你太快了;) – GBD

+0

@hakre说过一次.....谢谢:) – Baba

0
$whitelist = array(".jpg",".png"); 
foreach ($whitelist as $item) { 
    if(preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) { 
    $uploaddir='uploads/uploads_image/'; 
    // or code 
    } 
} 
+0

这个安全吗? ESP。反对将脚本上传到RCE? – evandrix

1
if($_FILES){ 
    $allowedExtensions = array("jpg","png"); 

    foreach($_FILES as $key=>$val){ 
     if(!empty($val['tmp_name'])){ 
      $ext = end(explode(".",strtolower(basename($val['name'])))); 
      if(in_array($ext,$allowedExtensions)){ 
       $file = 'PATH_TO_UPLOAD'.basename($val['name']); 

       if(move_uploaded_file($val['tmp_name'],$file)){ 
        //SUCCESS_MESSAGE 
       } 
      }else{ 
       //FAIL_MESSAGE 
      } 
     } 
    } 
} 
+0

+1没有遇到'结束'! –

1

您可以使用exif_imagetype($tmp_name)检查实际类型基于它的头文件。这会根据文件的内容检查文件的类型,因此它是最可靠的(例如,即使有人给你带有“.png”扩展名的JPG文件,它也会给你正确的信息)。

还有type属性($_FILES['myfile']['type']),它将为您提供浏览器声称该文件是的MIME类型。但是,如果有人恶意伪造请求,则不可信。

0

$ imageType = getimagesize($ tmp_name); 开关($ imageType ['mime']!=“image/jpg”或$ imageType ['mim']!=“image/png”){ //错误代码在这里。 }

这比检查扩展名更安全一些,因为扩展名可以很容易地更改。 mime类型也可以更改,但需要更多的知识xD

0

当然,您可以通过文件扩展名进行限制,但这不是安全的。你可以尝试重命名一个gif文件并上传它。有点安全的是使用MIME类型来检测文件类型(但仍然不能保证)。看看: How do I find the mime-type of a file with php?

我认为更安全的是试图获取图像的大小或如果转换为其他图像类型是成功的。