Безопасная загрузка изображения с помощью PHP?

Я хочу загрузить изображения на свой сервер из окна браузера. Однако поле для загрузки будет доступно для всех, поэтому мне нужно установить некоторые ограничения. Я только нашел загрузку файла w3schools (а с w3fools.com я не доверяю). Я хочу, чтобы ограничения были:

Максимальный размер 2,5M

Типы изображений jpg, jpeg, png, gif

Итак, вот код, который предоставляет w3schools, но он вообще не сохранит файл? Я немного изменил его, чтобы удовлетворить мои потребности.

<?php $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["file"]["name"])); if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpg") || ($_FILES["file"]["type"] == "image/jpeg")) || ($_FILES["file"]["type"] == "image/png")) && ($_FILES["file"]["size"] < 2500000) && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; } } else { echo "Invalid file"; } ?> 

И поскольку я не хочу, чтобы мой сайт был взломан, я хочу безопасное решение, любую помощь по этому поводу?

редактировать

Код даже не делает ничего. Итак, как мне это сделать?

Вам нужно использовать функцию php move_upload_file, а также я внес изменения в ваш оператор if здесь – рабочий и проверенный пример:

 <?php if (isset($_REQUEST["submit"])) { $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["file"]["name"])); if ($_FILES["file"]["type"] == "image/gif" || $_FILES["file"]["type"] == "image/jpg" || $_FILES["file"]["type"] == "image/jpeg" || $_FILES["file"]["type"] == "image/png" && $_FILES["file"]["size"] < 2500000 && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { $fname = $_FILES["file"]["name"]; move_uploaded_file($_FILES["file"]["tmp_name"], $fname); echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $fname; } } else { echo "Invalid file type"; } } ?> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" name="submit" value="submit" /> </form> 

Вы также можете использовать функцию getimagesize, как это было предложено, делая следующее:

 $size = getimagesize("http://img.ruphp.com/file-upload/060620121945.jpg"); $file_format = $size['mime']; 

$ file_format будет представлен как, например, «image / jpeg», поэтому вы можете легко проверить типы изображений следующим образом:

 foreach($allowedExts as $allowed) { $chk_types = strpos($file_format, $allowed); if($chk_types > -1) { $type_is_good = true; break; } } 

Использовать: move_uploaded_file, См., Руководство

И вот еще,

$_FILES["file"]["type"] не подходит для использования, поскольку это может быть изменено настройками браузера.

Вместо этого используйте getimagesize, см., Руководство

  1. $ ratio2) {$ thumb_w = $ new_w; $ Thumb_h = $ old_y / $ ratio1; } else {$ thumb_h = $ new_h; $ Thumb_w = $ old_x / $ ratio2; }
      $dst_img=ImageCreateTrueColor($thumb_w,$thumb_h); imagecopyresampled($dst_img,$src_img,0,0,0,0,$thumb_w,$thumb_h,$old_x,$old_y); if(!strcmp("png",$ext)) imagepng($dst_img,$filename); else imagejpeg($dst_img,$filename); imagegif($dst_img,$filename); imagedestroy($dst_img); imagedestroy($src_img); } } if(!function_exists('getExtension')) { function 

    getExtension ($ str) {$ i = strrpos ($ str, "."); if (! $ i) {return ""; } $ l = strlen ($ str) – $ i; $ ext = substr ($ str, $ i + 1, $ l); return $ ext; }}

     $image=$_FILES["$imagename"]['name']; if($image) { $filename = stripslashes($_FILES["$imagename"]['name']); $extension = getExtension($filename); $extension = 

    strtolower ($ расширение); if (($ extension! = "jpg") && ($ extension! = "jpeg") && ($ extension! = "png") && ($ extension! = "gif") && ($ extension! = "bmp" )) {

      $obj->set_flash("Unknown extension...!"); header("Location: $filename "); exit; } else { $size=getimagesize($_FILES["$imagename"]['tmp_name']); $sizekb=filesize($_FILES["$imagename"]['tmp_name']); if ($sizekb > MAX_SIZE*1024) { $obj->set_flash("You have exceeded the size limit...!"); header("Location: $filename"); exit; } $select_max = $obj->sql_query("select max($fieldname) as MaxID from ".$tablename.""); if($action=="Add") { $Max = $select_max[0]['MaxID']; $image_name = $Max + 1; $new_name = $image_name.".".$extension;//the new name will be containing the full path where will be stored (images folder) $$imagename = $new_name;//New Name of Image same as Image Field Name $thumbfilename = $new_name; $newname="$uploadpath/large/".$new_name; $copied = copy($_FILES["$imagename"]['tmp_name'], $newname); //we verify if the image has been uploaded, and print error instead if (!$copied) { $obj->set_flash("Copy unsuccessfull...!"); header("Location: $filename"); exit; } else { $thumb_name="$uploadpath/thumb/".$thumbfilename; $thumb=make_thumb($newname,$thumb_name,$WIDTH,$HEIGHT); } } if($action=="Update") { $new_name=$ID.".".$extension; $$imagename = $new_name;//New Name of Image same as Image Field Name $newname = "$uploadpath/large/".$new_name; $thumbfilename = $new_name; $copied = copy($_FILES["$imagename"]['tmp_name'], $newname); if (!$copied) { $obj->set_flash("Copy unsuccessfull...!"); header("Location: $filename"); exit; } else { $thumb_name="$uploadpath/thumb/".$thumbfilename; $thumb=make_thumb($newname,$thumb_name,$WIDTH,$HEIGHT); } } } } if($action=="Delete") { $SelectImage = $obj->sql_query("select $imagename from $tablename where $fieldname 

    = ". $$ fieldname." "); $ ThisImage = $ SelectImage [0] [" $ imagename "]; unlink (" $ uploadpath / thumb /".$ ThisImage); unlink ("$ uploadpath / large /".$ ThisImage);}?>

    1. Элемент списка
 <?php $file_name = $_FILES['file']['name']; $file_size = $_FILES['file']['size']; $file_tmp = $_FILES['file']['tmp_name']; $file_type = $_FILES['file']['type']; /* variable array for store errors */ $errors = []; /* Check if file already exists in location file save */ $file_dir = "uploads"; /** if folder not exists, then create it **/ if (!file_exists($file_dir)) { mkdir($file_dir, 0777, true); } $file_target = $file_dir . $file_name; if (file_exists($file_target)) { //$errors[] = "Sorry, <strong>{$file_name}</strong> already exists."; } /* Check file size */ if ($file_size > 2500000) { $errors[] = "Sorry, <strong>{$file_name}</strong> is too large. It size is {$file_size} > 2500000 bytes"; } /* Check current file formats with file secure */ $file_secure = array('jpg', 'jpeg', 'png', 'gif'); $file_current = strtolower(pathinfo($file_name, PATHINFO_EXTENSION)); /* (end(explode('.', $file_name) */ if (in_array($file_current, $file_secure) === false) { $errors[] = "Sorry, <strong>{$file_current}</strong> extension not allowed"; } /* Check if Errors exist, then not upload. Or if Errors NOT exist, then try upload */ if (!empty($errors)) { /* display error */ foreach ($errors as $keyError => $valueError) { echo "$keyError = $valueError <br />"; } echo "<br />"; echo "<strong>{$file_name}</strong> could not uploaded. <hr />"; } else { if (move_uploaded_file($file_tmp, $file_target)) { echo "Upload: " . $file_name . "<br />"; echo "Type: " . $file_type . "<br />"; echo "Size: " . ($file_size / 1024) . " Kb<br />"; echo "Stored in: " . $file_tmp; } else { echo "Invalid file"; } } ?>