#php
#php
Вопрос:
Не удается определить тип mime. если я удалю ($mime=="image/jpeg" || $mime=="image/pjpeg")
, это может привести к успешной загрузке изображения.
$mime = $_FILES['Filedata']['type'];
if((!empty($_FILES['Filedata']['tmp_name'])) amp;amp; ($_FILES['Filedata']['error'] == 0)) {
$filename = basename($_FILES['Filedata']['name']);
$ext = pathinfo($filename, PATHINFO_EXTENSION);
if (($ext=="jpg" || $ext=="jpeg") amp;amp; ($mime=="image/jpeg" || $mime=="image/pjpeg") amp;amp; ($_FILES["Filedata"]["size"] < 350000)) {
$newname = $filename;
if (!file_exists($newname)) {
if (move_uploaded_file($_FILES['Filedata']['tmp_name'], "./photo/" . $newname)) {
echo "It's done! The file has been saved as: ".$newname;
} else {
echo "Error: A problem occurred during file upload!";
}
} else {echo "Error: File ".$_FILES["uploaded_file"]["name"]." already exists";}
} else {
echo "Error: Only .jpg images under 350Kb are accepted for upload";
}
} else {
echo "Error: No file uploaded";
}
Комментарии:
1. Вы не должны полагаться на тип, переданный из браузера. Используйте
getimagesize()
вместо
Ответ №1:
name
и type
Информация для загруженных файлов должна рассматриваться как чисто информационная и никогда не использоваться для чего-либо серьезного, поскольку это информация, предоставленная пользователем, и ее можно легко подделать. Вам следует смотреть только на поля tmp_name
, error
и size
, чтобы определить, хотите ли вы принять файл. Чтобы найти фактический MIME-тип файла, используйте встроенные функции PHP:
if ($file['error'] == UPLOAD_ERR_NO_FILE) {
die('No file uploaded');
}
if ($file['error'] != UPLOAD_ERR_OK) {
die('Error during upload');
}
if (!$file['size'] || !is_uploaded_file($file['tmp_name'])) {
die('File is weird');
}
$extensions = array(IMAGETYPE_GIF => '.gif', IMAGETYPE_JPEG => '.jpg', IMAGETYPE_PNG => '.png');
$exifType = exif_imagetype($file['tmp_name']);
if (!isset($extensions[$exifType])) {
die('Unsupported file type');
}
$ext = $extensions[$exifType];
$targetDir = '/somewhere/else/';
do {
$target = $targetDir . uniqid() . $ext;
} while (file_exists($target));
if (!move_uploaded_file($file['tmp_name'], $target)) {
die('Something went wrong');
}
echo 'Yay, uploaded!';
Не то чтобы вам обязательно следовало использовать такое количество die()
инструкций, это просто для демонстрационных целей.
Комментарии:
1. exif состоит из информации заголовка в изображении? Что произойдет, если пользователь удалит информацию, вставленную Photoshop?
2. @Macris
exif
просматривает определенные магические байты в начале файла, которые должны быть у каждого допустимого изображения. Если этого не происходит, это недопустимое изображение.3. Я понимаю, но как откуда берется файл $? Разве нам не нужен [‘fileData’]? Не могли бы вы также показать мне загрузку HTML?
4. @Macris Это всего лишь краткий пример, просто представьте, что я сделал
$file = $_FILES['Filedata']
.;5. о, отлично, другим наиболее безопасным способом, который я могу придумать, является использование ImageMagick для чтения и записи нового изображения, это удалит все скрытые данные и позволит избежать сохранения вредоносного кода. Действительно ценю ваш код, я спешу развернуть свой веб-сайт!