#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 и использовать его функции. Все другие методы, похоже, устарели или требуют запуска команд оболочки.