Разрешен ли конкретный тип файла? Загрузка php

Я создаю загрузчик изображений, и я не знаю, как это сделать, только тип файла может быть .jpg так что я спрашиваю тебя, ты это знаешь?

heres, что я получил до сих пор:

<?php session_start(); if($_SESSION['username']) { $target_path = "users/$username/"; $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file ". basename( $_FILES['uploadedfile']['name']). "has been uploaded"; header("Location: user.php"); } else{ echo "There was an error uploading the file, please try again!"; } } else { echo "Only members can be here. Register <a href='index.php'>here</a>"; } ?> 

И еще одно, как я могу переименовать загруженный файл в «profile.jpg»?

Здесь есть несколько важных вещей:

Прежде всего, никогда не полагайтесь на расширение файла, которое было предоставлено. Я мог бы загрузить php-файл с расширением .jpg если бы захотел. Конечно, я, вероятно, должен был бы сделать еще кое-что, чтобы на самом деле заставить его выполнять как php-файл на вашем сервере, но это, безусловно, недействительный образ.

Если загрузка прошла успешно, $_FILES[ 'uploadedfile' ][ 'type' ] будет содержать тип mime, который был предоставлен запросом. Однако это также нельзя доверять, так как это может быть подделано.

Более надежный способ определить, действительно ли загруженный файл является изображением типа jpeg, заключается в использовании функции getimagesize . getimagesize() вернет false, если это не допустимое изображение и вернет массив с информацией об изображении, если он распознал файл как изображение. Индекс 2 массива будет содержать значение, соответствующее одной из этих констант, которые начинаются с IMAGETYPE_ .

 $info = getimagesize( $_FILES[ 'uploadedfile' ]['tmp_name'] ); if( $info !== false ) { // file is an image to begin with if( $info[ 2 ] == IMAGETYPE_JPEG ) { // file appears to be a valid jpeg image } } 

Это, скорее, старый школьный метод, который, насколько я знаю, является надежным.

Я полагаю, что в зависимости от платформы (Windows / * nix) и версии (<5.3,> = 5.3) есть более надежные способы определить фактический тип файла mime. Я посмотрю, что я смогу найти для вас позже.

редактировать:
Я забыл о переименовании.

Просто замените это:

 $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); 

… с этим:

 $target_path = $target_path . 'profile.jpg'; 

Другими словами, при перемещении файла с помощью move_uploaded_file() вторым аргументом будет новый путь (включая новое имя файла).

Магическое число jpeg равно 0xffd8, поэтому вы можете проверить, что первые два байта файла равны 0xff и 0xd8, а если нет, то это, конечно, не jpeg.

Пример:

 $fp = fopen($_FILES['uploadedfile']['tmp_name'], 'rb'); $bytes = fread($fp, 2); if (ord($bytes{0}) != 0xff && ord($bytes{1}) != 0xd8) { echo "Not JPEG!"; } else { echo "It is JPEG"; } 

Поистине вредоносный пользователь попытается загрузить файл, обойдя свою форму в целом, что позволит им загружать файл любого типа, дайте ему расширение .jpg, даже если это не так, отправьте образ / jpg | jpeg mime type, хотя это не правильный тип mime, потому что браузер просто отправляет этот тип mime в качестве сервиса для вас, но ему нельзя доверять.

Атрибут accept5 HTML5 позволяет указать, какие типы файлов будут принимать ваши данные:

 <input type="file" accept="image/jpeg" /> 

Это означает, что появится диалоговое окно выбора файла, которое позволит вам выбрать jpeg. Я не знаю, как хорошо это поддерживается в браузерах.

Изменить: я также не знаю, как браузер выполнит эту проверку. Если вы действительно хотите применить политику jpeg only , вам понадобится что-то вроде того, что предложил @drew010.

Вы можете использовать getimagesize() для проверки формата изображения.

Однако обеспечение загрузки файлов очень сложно, и требуются дополнительные шаги. Например, опасно использовать предоставленное пользователем исходное имя файла.

См. Этот вопрос для расширенного обсуждения о том, что можно / нужно сделать для достижения действительно высокого уровня безопасности:

Подход к безопасности загрузки изображений PHP

Существуют различные проверки, которые вы можете сделать, чтобы разрешить только изображения в формате JPG в соответствии с уровнем безопасности, который вы хотите достичь.

Просто вы можете проверить расширение * jpg, но это было бы очень наивно, как если бы файл был переименован, он обманет ваш код. Другой способ – проверить тип MIME (jpeg или pjpeg), который является частью массива $ _FILES

 $_FILES['uploadedfile']['type'] 

но эта информация ненадежна и может быть подделана.

Но лучшим решением, которое приходит мне на ум, является использование функции getimagesize () , которая анализирует изображения, и вы можете получить несколько информации, наиболее важным из которых является проверка подлинности файла на самом деле. Эта функция возвращает массив с 7 элементами.

 Index 0 and 1 contains the width and the height of the image. Index 2 is one of the IMAGETYPE_XXX constants indicating the type of the image. Index 3 is a text string with the correct height="yyy" width="xxx" string *mime* is the correspondant MIME type of the image. *channels* will be 3 for RGB pictures and 4 for CMYK pictures. *bits* is the number of bits for each color. 

Вышеприведенная информация взята на странице руководства.

Существует много возможностей, чтобы сделать загрузку изображений более безопасными:

  • Измените размер изображения до стандартного размера. Это гарантирует, что вредоносный код в загруженном изображении будет взломан.
  • Переименуйте загруженное изображение в единую схему имен, что затрудняет запрос подготовленного файла, и вы можете обеспечить правильное расширение файла.
  • Сделайте некоторые настройки в файле .htaccess, поэтому из каталога картинок будут доставлены только файлы jpg.

Вот пример того, как написать файл .htaccess:

 IndexIgnore * Deny from all <FilesMatch "\.(jpg|jpeg)$"> Allow from all </FilesMatch> 

Это некоторые моменты, которые, по моему мнению, важны, но список, конечно, не является ключевым.