0

可能重复:
如何只允许在 php 中上传某些文件类型?

如何使下面的脚本只允许 .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>";
4

6 回答 6

1

您可以尝试使用pathinfo&exif_imagetype

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

查看更多信息以检测假图像

于 2012-10-12T17:24:56.070 回答
1

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

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

于 2012-10-12T17:30:11.073 回答
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
            }
        }
    }
}
于 2012-10-12T17:28:50.907 回答
0

$imageType = getimagesize($tmp_name); switch ($imageType['mime'] != "image/jpg" OR $imageType['mim'] != "image/png") { //错误代码在这里。}

它比检查扩展更安全,因为扩展可以轻松更改。哑剧类型也可以更改,但需要更多知识 xD

于 2012-10-12T17:33:50.193 回答
0

当然,您可以通过文件扩展名进行限制,但这并不安全。您可以尝试重命名 gif 文件并上传。更安全一点的是使用 mime-type 来检测文件类型(但仍然不能保证)。看: 如何用php找到文件的mime-type?

我认为更安全的是尝试获取图像大小或者转换为另一种图像类型是否成功。

于 2012-10-12T17:35:29.590 回答
0
$whitelist = array(".jpg",".png");
foreach ($whitelist as $item) {
  if(preg_match("/$item\$/i", $_FILES['uploadfile']['name'])) {
    $uploaddir='uploads/uploads_image/';
    // or code
  }
}
于 2012-10-12T17:27:47.633 回答