Загрузка файла Internet Explorer завершается ошибкой проверки mime-типа

#php #internet-explorer #file-upload #mime-types

#php #internet-explorer #загрузка файла #mime-типы

Вопрос:

Я собрал несколько скриптов из различных интернет-источников, чтобы заставить форму работать. Я столкнулся с проблемой, которую не могу решить. Созданная мной форма позволяет пользователю отправлять свои данные в полях, а также прикреплять изображение (проверка: формат .EPS или .JPG).

Скрипт отлично работает в Firefox и Safari, но не в Internet Explorer. В IE, независимо от того, прикрепляете вы изображение правильного типа или нет, оно возвращает ошибку из-за неправильного типа файла. Таким образом, по какой-то причине кажется, что IE не проверяет тип файла, как об этом просит PHP.

 <?php
/* ....
   snip
   .... */
      $filetype=$_FILES["prosp_client_logo"]["type"];
/* ....
   snip
   .... */
      elseif($filetype=="application/postscript" or $filetype=="image/jpg" or $filetype=="image/jpeg") {
/* ....
   snip
   .... */
?>
  

Пожалуйста, дайте мне знать, если вам нужны какие-либо разъяснения.

Комментарии:

1. Привет, там много кода, который не решает проблему, которую вы описываете. Не могли бы вы сократить это до простого кода, который обрабатывает загруженный файл и возвращает ошибку (и дважды проверьте, что ошибка возникает с вашим урезанным кодом).

2. Это не то, о чем вы спрашивали, но кто-нибудь обязательно вам скажет, и с таким же успехом это могу быть я. Вам следует ознакомиться с атаками с использованием SQL-инъекций, к которым уязвим ваш скрипт. Всякий раз, когда вы передаете переменную в SQL-запрос, вы должны сначала передать ее через mysql_real_escape_string() . Примерами в вашем коде могут быть ` $ newentry=»ВСТАВИТЬ В тестовую таблицу (…) ЗНАЧЕНИЯ (‘NULL’, ‘$user_name’, ‘$user_email’, ‘$filename’)»;`Сначала вы должны вызвать $user_name = mysql_real_escape_string($user_name); и т.д. Все эти переменные.

3. Спасибо, у меня было ощущение, что мой сценарий небезопасен. Я попробую вставить этот код.

4. @preinheimer — я уже значительно урезал его (это гораздо более длинная форма), но многое оставил, потому что не был уверен, где я мог ошибиться с IE. Я знаю, что это не очень хорошо структурировано. Я постараюсь доработать дальше, но приветствуются любые предложения по поводу того, что у меня здесь есть. Спасибо!

5. @BrianChicago76: Я сделал обрезку для вас. 🙂

Ответ №1:

http://www.php.net/manual/en/features.file-upload.php#75932

Ричард Дэйви Рич из corephp dot co, Великобритания 22 июня 2007 12:05
[…] возможно, вы склонны проверять обновление на основе сообщенного mime-типа из массива $_FILES. Однако будьте осторожны с этим — оно устанавливается браузером, а не PHP или веб-сервером, и браузеры несовместимы (что нового?!)

IE отправит свое собственное вложение mime-type (на основе ассоциации с файловой системой), которое часто может отличаться от того, что вы ожидаете в своем коде. Эти данные также могут быть подделаны, поэтому лучше не доверять тому, что браузер говорит о файле mime-type .

Также:

http://www.php.net/manual/en/features.file-upload.php#53133

кит из phpdiary dot org 24 мая 2005 11:14
[…] Лучше всего было бы, если бы вы проверили расширение файла и использовали exif_imagetype() для проверки правильности изображений. Многие люди предлагали использовать getimagesize(), который возвращает массив, если файл действительно является изображением, и false в противном случае, но exif_imagetype() намного быстрее. (в руководстве так сказано)

Комментарии:

1. Спасибо за предложение. Можете ли вы предоставить строку кода, которая это делает, или я могу найти, как это сделать на PHP.net ?

2. @BrianChicago76: Посмотрите на PHP.net ручные записи для getimagesize() (или, предпочтительно) exif_imagetype()

3. И если бы вы могли дать мне общее представление о том, куда вставить эту проверку, т. е. exif_imagetype (), и какой код я должен удалить, это было бы огромной помощью. Как я уже сказал, я огромный новичок. Спасибо, ребята.

4. @jnpcl: в exif_imagetype (), похоже, нет postscript (EPS) в качестве опции в разделе константы imagetype. Есть ли способ проверить, является ли файл изображения EPS? Спасибо.

5. @BrianChicago76: Похоже, лучший метод — установить расширение FileInfo PECL и использовать его функции. Все другие методы, похоже, устарели или требуют запуска команд оболочки.