Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: как позволить загрузку только zip-файлов?
 
 автор: kb_nn   (01.06.2010 в 13:34)   письмо автору
 
 

почему, например, при загрузке zip-архива на сервер поле type массива $_FILES['myfile'] оказывается пустым? для некоторых браузеров.

  Ответить  
 
 автор: Саня   (01.06.2010 в 13:42)   письмо автору
 
   для: kb_nn   (01.06.2010 в 13:34)
 

Всё равно прийдётся проверять на сервере.
В РНР есть функция mime_content_type(), позволяющая определить mime-тип файла.
На РНР 5.3 и выше лучше использовать finfo_file().

  Ответить  
 
 автор: buldovsky   (01.06.2010 в 14:43)   письмо автору
 
   для: Саня   (01.06.2010 в 13:42)
 

Очень маловероятно что mime_content_type() заработает на платном хостинге, да и РНР 5.3 далеко не везде стоит.

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 15:02)   письмо автору
 
   для: buldovsky   (01.06.2010 в 14:43)
 

слушайте, похоже обиженными оказались только zip-файлы. для других типов ['type'] определяется совершенно нормально.

  Ответить  
 
 автор: buldovsky   (01.06.2010 в 15:25)   письмо автору
 
   для: kb_nn   (01.06.2010 в 15:02)
 

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

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 15:52)   письмо автору
 
   для: buldovsky   (01.06.2010 в 15:25)
 

типы файлов $_FILES['file']['type'] определяет браузер? это как?

  Ответить  
 
 автор: buldovsky   (01.06.2010 в 15:57)   письмо автору
 
   для: kb_nn   (01.06.2010 в 15:52)
 

> типы файлов $_FILES['file']['type'] определяет браузер?

Если бы типы файлов определял ваш сервер, то наверное тип файла, загружаемого разными браузерами наверное был одинаковым??? А он, как вы говорите, почему-то разный...

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 15:57)   письмо автору
 
   для: buldovsky   (01.06.2010 в 15:57)
 

это меня и смущает

  Ответить  
 
 автор: buldovsky   (01.06.2010 в 16:04)   письмо автору
 
   для: kb_nn   (01.06.2010 в 15:57)
 

До сих пор смущает?

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 16:21)   письмо автору
 
   для: buldovsky   (01.06.2010 в 16:04)
 

а тогда как реально 100%-но определять любой тип файла?
я всегда полагался на ['type'] и никогда не видел, чтобы это делали по другому.

  Ответить  
 
 автор: Саня   (01.06.2010 в 16:35)   письмо автору
 
   для: kb_nn   (01.06.2010 в 16:21)
 

['type'] приходит со стороны браузера. Другими словами, я могу написать скрипт, который отправит картинку jpg, но в ['type'] подставит text/html. Нельзя доверять данным, пришедшим от пользователя.

Тип всегда нужно проверять на сервере. Функция mime_content_type() использует файл magic.mime. В этом файле описаны сигнатуры форматов. Сигнатуры основаны на том предположении, что некоторый формат содержит в себе определённую неизменную последовательность байтов в начале файла (но не обязательно в начале). Поэтому с большой долей вероятности, файл, содержащий определённую сигнатуру, имеет mime-тип, привязанный к этой сигнатуре.

finfo_file() использует более продвинутую систему определения типа на основе структуры файла соответственно его спецификации.

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 16:56)   письмо автору
 
   для: Саня   (01.06.2010 в 16:35)
 

это накладывает требования на сервер., вот в чем минус.
хотя похоже это стоит того.
но никогда не думал, что проверка ['type'] сродни проверки по расширению

  Ответить  
 
 автор: Саня   (01.06.2010 в 17:19)   письмо автору
 
   для: kb_nn   (01.06.2010 в 16:56)
 

А то. Первая запоедь программиста гласит: "Не доверяй данным, пришедшим от пользователя". Из-за этого упущения многие системы взламывают. Взять даже такую безобидную на первый взгляд переменную $_SERVER['PHP_SELF']. А она всё-таки зависит от пользовательских данных. И поэтому всякие скрипты вроде <form action="<?=$_SERVER['PHP_SELF']?>"> определённо подвержены атаке типа XSS.

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 17:31)   письмо автору
 
   для: Саня   (01.06.2010 в 17:19)
 

хм. да. сколько узнал я нового за сегодня. про $_SERVER['PHP_SELF'] я такого не знал.
я просто всегда думал, что $_FILES получаю от сервера.
а заповедь такая мне прекрасно известна.

  Ответить  
 
 автор: Trianon   (01.06.2010 в 20:34)   письмо автору
 
   для: Саня   (01.06.2010 в 17:19)
 

>Взять даже такую безобидную на первый взгляд переменную $_SERVER['PHP_SELF'].
>А она всё-таки зависит от пользовательских данных.
>И поэтому всякие скрипты вроде <form action="<?=$_SERVER['PHP_SELF']?>"> определённо подвержены атаке типа XSS.

Но простите, здесь же просто ошибка обработки потока данных?
если написать <form action="<?=htmlspecialchars($_SERVER['PHP_SELF']) ?>"> , Вы ведь уберете свое утверждение?
Входная переменная осталась та же, зависимость от пользовательских данных - прямейшая. XSS - нету.

  Ответить  
 
 автор: Саня   (01.06.2010 в 20:42)   письмо автору
 
   для: Trianon   (01.06.2010 в 20:34)
 

Я говорю лишь о том, что встречается сплошь и рядом. Распространено заблуждение, что элементы в массиве $_SERVER назначены сервером и поэтому им можно беспрекословно верить. Хорошо хоть понимают, что элементам $_SERVER['HTTP_*'] точно нельзя верить. И то не всегда. Например в случае HTTP_X_RORWARDED_FOR — пихают в базу как есть, не думая о том, что там может быть совсем не IP-адрес. Чего уж скрывать — я и сам когда-то писал PHP_SELF в формах. Сейчас я её вообще нигде не использую.

  Ответить  
 
 автор: buldovsky   (01.06.2010 в 16:44)   письмо автору
 
   для: kb_nn   (01.06.2010 в 16:21)
 

100% гарантии никто не даст. Даже генетическая экспертиза дает 99.9% вероятность прямого родства)))

Обычно тип файла указывается в первых байтах. До появления специальных функций типа finfo_file приходилось либо читать и сверять эти байты, либо смотреть заголовки которые возвращаются при GET запросе к url. С изображениями дело чуть проще, по результатам выполнения некоторых функций можно косвенно судить о том это картинка, например.

Определить тип файла

  Ответить  
 
 автор: Trianon   (01.06.2010 в 16:06)   письмо автору
 
   для: kb_nn   (01.06.2010 в 15:52)
 

не определяет.
заявляет.

  Ответить  
 
 автор: Саня   (01.06.2010 в 15:17)   письмо автору
 
   для: buldovsky   (01.06.2010 в 14:43)
 

Можно ориентироваться на первые 4 байта файла. Они всегда равны "PK\003\004" у ZIP. Во всяком случае в magic.mime именно эти байты прописаны для ZIP.

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 15:22)   письмо автору
 
   для: Саня   (01.06.2010 в 15:17)
 

м. надо попробовать, спасибо.

  Ответить  
 
 автор: Саня   (01.06.2010 в 15:22)   письмо автору
 
   для: kb_nn   (01.06.2010 в 15:22)
 

<?
$file_hdr 
file_get_contents('test.zip'0null04);
if ( 
"PK\003\004" == $file_hdr ) {
  print 
'Этот файл - ZIP';
}

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 15:49)   письмо автору
 
   для: Саня   (01.06.2010 в 15:22)
 

работает, спасибо.

только а если мне понадобится другой тип файла?

  Ответить  
 
 автор: Саня   (01.06.2010 в 16:43)   письмо автору
 
   для: kb_nn   (01.06.2010 в 15:49)
 

Значит надо подсмотреть какая сигнатура используется в том, другом, типе файла и дописать скрипт соответствующей проверкой.

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 15:14)   письмо автору
 
   для: Саня   (01.06.2010 в 13:42)
 

такой вариант мне не подойдет

  Ответить  
 
 автор: Gubichev   (01.06.2010 в 15:35)   письмо автору
 
   для: kb_nn   (01.06.2010 в 15:14)
 

$_FILES['file']['type'] не работает?

  Ответить  
 
 автор: kb_nn   (01.06.2010 в 15:52)   письмо автору
 
   для: Gubichev   (01.06.2010 в 15:35)
 

ну вот как выяснилось, не всегда

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования