|
|
|
| почему, например, при загрузке zip-архива на сервер поле type массива $_FILES['myfile'] оказывается пустым? для некоторых браузеров. | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 13:34)
| | Всё равно прийдётся проверять на сервере.
В РНР есть функция mime_content_type(), позволяющая определить mime-тип файла.
На РНР 5.3 и выше лучше использовать finfo_file(). | |
|
|
|
|
|
|
|
для: Саня
(01.06.2010 в 13:42)
| | Очень маловероятно что mime_content_type() заработает на платном хостинге, да и РНР 5.3 далеко не везде стоит. | |
|
|
|
|
|
|
|
для: buldovsky
(01.06.2010 в 14:43)
| | слушайте, похоже обиженными оказались только zip-файлы. для других типов ['type'] определяется совершенно нормально. | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 15:02)
| | Ничего не нормально, типы файлов определяет и отправляет браузер и делает он это как ему нравится. Ваше право верить ему или проверить. Если считаете это нормальным, примите вашу проблему как есть, если хотите быть уверены в том, что вам подсовывают, то найдите способ проверить тип файла на сервере, например попробовать его прочитать. | |
|
|
|
|
|
|
|
для: buldovsky
(01.06.2010 в 15:25)
| | типы файлов $_FILES['file']['type'] определяет браузер? это как? | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 15:52)
| | > типы файлов $_FILES['file']['type'] определяет браузер?
Если бы типы файлов определял ваш сервер, то наверное тип файла, загружаемого разными браузерами наверное был одинаковым??? А он, как вы говорите, почему-то разный... | |
|
|
|
|
|
|
|
для: buldovsky
(01.06.2010 в 15:57)
| | это меня и смущает | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 15:57)
| | До сих пор смущает? | |
|
|
|
|
|
|
|
для: buldovsky
(01.06.2010 в 16:04)
| | а тогда как реально 100%-но определять любой тип файла?
я всегда полагался на ['type'] и никогда не видел, чтобы это делали по другому. | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 16:21)
| | ['type'] приходит со стороны браузера. Другими словами, я могу написать скрипт, который отправит картинку jpg, но в ['type'] подставит text/html. Нельзя доверять данным, пришедшим от пользователя.
Тип всегда нужно проверять на сервере. Функция mime_content_type() использует файл magic.mime. В этом файле описаны сигнатуры форматов. Сигнатуры основаны на том предположении, что некоторый формат содержит в себе определённую неизменную последовательность байтов в начале файла (но не обязательно в начале). Поэтому с большой долей вероятности, файл, содержащий определённую сигнатуру, имеет mime-тип, привязанный к этой сигнатуре.
finfo_file() использует более продвинутую систему определения типа на основе структуры файла соответственно его спецификации. | |
|
|
|
|
|
|
|
для: Саня
(01.06.2010 в 16:35)
| | это накладывает требования на сервер., вот в чем минус.
хотя похоже это стоит того.
но никогда не думал, что проверка ['type'] сродни проверки по расширению | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 16:56)
| | А то. Первая запоедь программиста гласит: "Не доверяй данным, пришедшим от пользователя". Из-за этого упущения многие системы взламывают. Взять даже такую безобидную на первый взгляд переменную $_SERVER['PHP_SELF']. А она всё-таки зависит от пользовательских данных. И поэтому всякие скрипты вроде <form action="<?=$_SERVER['PHP_SELF']?>"> определённо подвержены атаке типа XSS. | |
|
|
|
|
|
|
|
для: Саня
(01.06.2010 в 17:19)
| | хм. да. сколько узнал я нового за сегодня. про $_SERVER['PHP_SELF'] я такого не знал.
я просто всегда думал, что $_FILES получаю от сервера.
а заповедь такая мне прекрасно известна. | |
|
|
|
|
|
|
|
для: Саня
(01.06.2010 в 17:19)
| | >Взять даже такую безобидную на первый взгляд переменную $_SERVER['PHP_SELF'].
>А она всё-таки зависит от пользовательских данных.
>И поэтому всякие скрипты вроде <form action="<?=$_SERVER['PHP_SELF']?>"> определённо подвержены атаке типа XSS.
Но простите, здесь же просто ошибка обработки потока данных?
если написать <form action="<?=htmlspecialchars($_SERVER['PHP_SELF']) ?>"> , Вы ведь уберете свое утверждение?
Входная переменная осталась та же, зависимость от пользовательских данных - прямейшая. XSS - нету. | |
|
|
|
|
|
|
|
для: Trianon
(01.06.2010 в 20:34)
| | Я говорю лишь о том, что встречается сплошь и рядом. Распространено заблуждение, что элементы в массиве $_SERVER назначены сервером и поэтому им можно беспрекословно верить. Хорошо хоть понимают, что элементам $_SERVER['HTTP_*'] точно нельзя верить. И то не всегда. Например в случае HTTP_X_RORWARDED_FOR — пихают в базу как есть, не думая о том, что там может быть совсем не IP-адрес. Чего уж скрывать — я и сам когда-то писал PHP_SELF в формах. Сейчас я её вообще нигде не использую. | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 16:21)
| | 100% гарантии никто не даст. Даже генетическая экспертиза дает 99.9% вероятность прямого родства)))
Обычно тип файла указывается в первых байтах. До появления специальных функций типа finfo_file приходилось либо читать и сверять эти байты, либо смотреть заголовки которые возвращаются при GET запросе к url. С изображениями дело чуть проще, по результатам выполнения некоторых функций можно косвенно судить о том это картинка, например.
Определить тип файла | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 15:52)
| | не определяет.
заявляет. | |
|
|
|
|
|
|
|
для: buldovsky
(01.06.2010 в 14:43)
| | Можно ориентироваться на первые 4 байта файла. Они всегда равны "PK\003\004" у ZIP. Во всяком случае в magic.mime именно эти байты прописаны для ZIP. | |
|
|
|
|
|
|
|
для: Саня
(01.06.2010 в 15:17)
| | м. надо попробовать, спасибо. | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 15:22)
| |
<?
$file_hdr = file_get_contents('test.zip', 0, null, 0, 4);
if ( "PK\003\004" == $file_hdr ) {
print 'Этот файл - ZIP';
}
|
| |
|
|
|
|
|
|
|
для: Саня
(01.06.2010 в 15:22)
| | работает, спасибо.
только а если мне понадобится другой тип файла? | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 15:49)
| | Значит надо подсмотреть какая сигнатура используется в том, другом, типе файла и дописать скрипт соответствующей проверкой. | |
|
|
|
|
|
|
|
для: Саня
(01.06.2010 в 13:42)
| | такой вариант мне не подойдет | |
|
|
|
|
|
|
|
для: kb_nn
(01.06.2010 в 15:14)
| | $_FILES['file']['type'] не работает? | |
|
|
|
|
|
|
|
для: Gubichev
(01.06.2010 в 15:35)
| | ну вот как выяснилось, не всегда | |
|
|
|