PHP « upload файлов.xls Проверка mime types

Есть некая форма с аплоадом файлом .xls, среди прочих проверок файла, есть еще и :
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .php.geshi_code {font-family:monospace;} .php.geshi_code .imp {font-weight: bold; color: red;} .php.geshi_code .kw1 {color: #b1b100;} .php.geshi_code .kw2 {color: #000000; font-weight: bold;} .php.geshi_code .kw3 {color: #990000;} .php.geshi_code .co1 {color: #666666; font-style: italic;} .php.geshi_code .co2 {color: #666666; font-style: italic;} .php.geshi_code .co3 {color: #0000cc; font-style: italic;} .php.geshi_code .co4 {color: #009933; font-style: italic;} .php.geshi_code .coMULTI {color: #666666; font-style: italic;} .php.geshi_code .es0 {color: #000099; font-weight: bold;} .php.geshi_code .es1 {color: #000099; font-weight: bold;} .php.geshi_code .es2 {color: #660099; font-weight: bold;} .php.geshi_code .es3 {color: #660099; font-weight: bold;} .php.geshi_code .es4 {color: #006699; font-weight: bold;} .php.geshi_code .es5 {color: #006699; font-weight: bold; font-style: italic;} .php.geshi_code .es6 {color: #009933; font-weight: bold;} .php.geshi_code .es_h {color: #000099; font-weight: bold;} .php.geshi_code .br0 {color: #009900;} .php.geshi_code .sy0 {color: #339933;} .php.geshi_code .sy1 {color: #000000; font-weight: bold;} .php.geshi_code .st0 {color: #0000ff;} .php.geshi_code .st_h {color: #0000ff;} .php.geshi_code .nu0 {color: #cc66cc;} .php.geshi_code .nu8 {color: #208080;} .php.geshi_code .nu12 {color: #208080;} .php.geshi_code .nu19 {color:#800080;} .php.geshi_code .me1 {color: #004000;} .php.geshi_code .me2 {color: #004000;} .php.geshi_code .re0 {color: #000088;} .php.geshi_code span.xtra { display:block; }
<?php

if($_FILES["filename"]["type"] != 'application/vnd.ms-excel'){
      exit('Ошибка');
    }
?>


Так вот данная проверка странно работает.
Когда я загружаю файл со своего комп’ютера (Ubuntu + Chrome) - все хорошо проходит, а если грузить этот же файл но с WinXP + Chrome - получаем ошибку, с WinXP + Firefox - загружает отлично.
Подскажите как решить проблему.

1 ответов


Я бы добавил кое-что к ответу @vlasrv . В PHP есть соответствующие функции для более корректного определения MIME-TYPE. Для PHP версий 5.2.x и ниже - это mime_content_type() , а для версий 5.3 и выше - желательно использовать Fileinfo.
Определять тип с помощью $_FILES["filename"]["type"] - это очень плохое решение. Можете сами поэкспериментировать. Создайте какой-нибудь файл script.js, а потом вручную измените разширение на jpg. Что мы увидим, если выведем на экран $_FILES["filename"]["type"]? Результат - image/jpeg, хотя по сути, файл остался js-скриптом.


Попробуйте продебажить свой процесс загрузки, или сделайте так если не умеете

var_dump($_FILES["filename"]);
if($_FILES["filename"]["type"] != 'application/vnd.ms-excel'){
      exit('Ошибка');
}
Хоть увидите что у Вас приходит в $_FILES

Никогда не доверяйте содержимому type массива $_FILES, эти данные приходят от клиента и там может быть что угодно. Для проверки типа файла используйте серверное ПО, например, в nix имеется команда file позволяющая получить mime-type файла.

file --mime /path/to/file.xls
Выведет нечто похожее:
/path/to/file.xls: application/vnd.ms-office; charset=binary