Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> не работает проверка на тип и размер файла 
:(
    Опции темы
bazzjr
Дата 22.1.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: 4
Всего: 6



Код:

Код

$formats = array('jpg', 'gif', 'png', 'jpeg');
$max_size = 5;
$error = '';

if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
  $file=$_FILES['userfile'];
  if (!preg_match('/\.('.join('|', $formats).')$/i', $file['name'])) {
    $error = 'Неверный формат файла! Допускаются файлы формата jpg, gif, png!';
  }
  elseif ($file["size"]>1024*$max_size*1024) {
    $error = 'Размер загружаемого файла не должен превышать 2 мегабайта!';
  }else
                        $directory_location="files/domfoto/";
        $sim = strlen($_FILES['userfile']['name']);
                   $type = trim(substr($_FILES['userfile']['name'],$sim-3,$sim));
        $time_=time();
        $filename = $time_.".$type";
        copy($_FILES['userfile']['tmp_name'], $directory_location.$filename);
        $error=0;
   
}
if ($error==0){
    echo '<script>';
    echo 'window.parent.document.getElementById(\'foto\').innerHTML=\''.$error.'<center><img align=center src="'.$url_foto.$filename.'"></center>\';';
    echo 'window.parent.document.getElementById(\'loading-layer\').style.display=\'none\';';
    echo 'window.parent.document.getElementById(\'contentt\').disabled=\'\';';
    echo '</script>';
}else{
    echo 'window.parent.document.getElementById(\'foto\').innerHTML=\''.$error.'\';';
    echo '<script>';
    echo 'window.parent.document.getElementById(\'loading-layer\').style.display=\'none\';';
    echo '</script>';
}


1.Ничего не выводит $error при неверных форматах и размерах.
2.Если размер фала в районе 2-х мегабайт, то тоже незагружается файл и ошибки никакой не выдает сервер, так происходит и на localhost и на сервере в инете.

ПОЧЕМУ нет ошибки и как сделать правильно проверку на размер и формат файла???
PM MAIL ICQ   Вверх
bazzjr
Дата 22.1.2009, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: 4
Всего: 6



Неужели никто не знает в чем ошибка? и как реализовать "правильную" проверку на размер и расширение файла?  smile 
PM MAIL ICQ   Вверх
bars80080
Дата 22.1.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



ладно, по всем показателям ещё не проверял, но поробуй вот эту функцию:
Код
function fileUpLoader($file, $path, $type = array(), $newname = '', $rewrite = '', $message = array()) {
    $ftemp = $_FILES[$file]['tmp_name'];
    $fname = $_FILES[$file]['name'];
    $fsize = $_FILES[$file]['size'];
    $ftype = $_FILES[$file]['type'];
    $error = $_FILES[$file]['error'];
    
    $b = array(); $path1 = ''; $time = time();
    if(!empty($message)) { $msg = $message; }
    else { 
        $msg = array('Size of file is bigger than upload_max_filesize', 'Size of file is bigger than max_file_size',
                    'Upload only a part of file', 'File isn`t uploaded', 'Unknown error',
                    'Directory not found', 'Perhaps, attack throught upload', 'Extension isn`t validate',
                    'Can`t remove file to directory', 'Upload of file is succesfully'); 
    }
    // search errors
    if($error > 0) {
        $b[0] = false;
        switch($error) {
            case 1: $b[1] = $msg[0]; break;
            case 2: $b[1] = $msg[1]; break;
            case 3: $b[1] = $msg[2]; break;
            case 4: $b[1] = $msg[3]; break;
            default: $b[1] = $msg[4]; break; }
        return $b; }
    if(!file_exists($path)) { $b = array(false, $msg[5]); return $b; }
    if(!is_uploaded_file($ftemp)) { $b = array(false, $msg[6]); return $b; }
    // control of extention
    $pathInfo = pathinfo($fname);
    $ext = $pathInfo['extension'];
    if(!empty($type)) {
        $flag = false; $c = count($type);
        if(!empty($pathInfo['extension'])) {
            for($i = 0; $i < $c; $i++) {
                if($type[$i] == $pathInfo['extension']) {
                    $flag = true; break; }}}
        if(!$flag) { $b = array(false, $msg[7]); return $b; }}
    if(!empty($pathInfo['extension'])) $pathInfo['extension'] = '.'.$pathInfo['extension'];
    // rename file
    if($newname === true) { $path1 = $path.$time.'000'.$pathInfo['extension']; }
    elseif(!empty($newname)) { $path1 = $path.$newname.$pathInfo['extension']; }
    else { $path1 = $path.$fname; }
    if(empty($rewrite) && file_exists($path1)) {
        if($newname === true) {
            for($i = 1; $i < 1000; $i++) {
                $path1 = $path.$time.substr('00'.$i, -3).$pathInfo['extension'];
                if(!file_exists($path1)) { break; }}}
        else { 
            if(empty($newname)) { $newname = $pathInfo['filename']; }
            for($i = 0; $i < 1000; $i++) {
                $path1 = $path.$newname.$i.$pathInfo['extension'];
                if(!file_exists($path1)) { break; }}}}
    if(!move_uploaded_file($ftemp, $path1)) {          
        $b = array(false, $msg[8]); return $b; }
    $b = array(true, $msg[9], $path1); return $b;
}


использование:
$r = fileUpLoader('fieldname', 'directory/', array('jpg','jpeg','png','gif'));

$file - имя поля, $path - путь, куда положить файл, $type - массив расширений, если не указывать, то любые, 
$newname - если не указывать, то сохранится под своим именем, если указать, то новое имя, если поставить true, то сам сгенерирует новое имя, 
$rewrite - переписать ли файл с таким же именем

результат возвращается в виде массива [result, message, path]
result - true - если удачно, false - если не получилось, 
message - какая ошибка, 
path - если удачно, то вернёт путь к новому файлу

Это сообщение отредактировал(а) bars80080 - 22.1.2009, 15:41
PM MAIL WWW   Вверх
bazzjr
Дата 22.1.2009, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: 4
Всего: 6



хорошо bars80080 сегодня вечерком после работы проверю.  smile 
о результате дам знать.

Это сообщение отредактировал(а) bazzjr - 22.1.2009, 15:14
PM MAIL ICQ   Вверх
bars80080
Дата 22.1.2009, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



сыровата слегка, сейчас подправил кое-что
PM MAIL WWW   Вверх
Hellka
Дата 22.1.2009, 23:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 58
Регистрация: 2.2.2006

Репутация: нет
Всего: нет



а в переменной $file["size"] вообще есть что-то перед проверкой?

сразу-то никак проверять вот так:
Код

 elseif ($_FILES['userfile']['size']>1024*$max_size*1024)

зачем переменные лишние?
так-то по идее правильно написано, проверяй содержимое массива....

а для формата юзай:
$HTTP_POST_FILES['userfile']['type']
только ишак и фаерфокс например для пнг файла выдают разные значения
image/x-png и image/png

PM MAIL   Вверх
bazzjr
Дата 23.1.2009, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: 4
Всего: 6



bars80080 Отлично! Все робит... немного дописал код под себя(ресайз добавил).
Только вот одно но - в IE6 пишет ошибку "Perhaps, attack throught upload" а в ФФ и Опере все нормуль!

я так понимаю ошибка  здесь?:
Код

for($i = 0; $i < $c; $i++) {
                if($type[$i] == $pathInfo['extension']) {
                    $flag = true; break; }}}
        if(!$flag) { $b = array(false, $msg[7]); return $b; }}



PM MAIL ICQ   Вверх
skyboy
Дата 23.1.2009, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(bazzjr @  23.1.2009,  04:04 Найти цитируемый пост)
Только вот одно но - в IE6 пишет ошибку

потому что IE отсылает jpeg файл с заголовком Content-Type: image/pjpeg, а Опера с Firefox - стандартное image/jpeg

Добавлено через 53 секунды
кстати, про эту особенность уже говорили здесь:
Цитата(Hellka @  22.1.2009,  22:31 Найти цитируемый пост)
только ишак и фаерфокс например для пнг файла выдают разные значения
image/x-png и image/png


PM MAIL   Вверх
bars80080
Дата 23.1.2009, 10:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



Цитата(bazzjr @  23.1.2009,  04:04 Найти цитируемый пост)
я так понимаю ошибка  здесь?:

нет


Цитата(skyboy @  23.1.2009,  08:27 Найти цитируемый пост)
потому что IE отсылает jpeg файл с заголовком Content-Type: image/pjpeg, а Опера с Firefox - стандартное image/jpeg

так что же, выкинуть проверку:
Код

    if(!is_uploaded_file($ftemp)) { $b = array(false, $msg[6]); return $b; }
?
я так понимаю, она сама по себе не корректна?
PM MAIL WWW   Вверх
skyboy
Дата 23.1.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(bars80080 @  23.1.2009,  09:25 Найти цитируемый пост)
я так понимаю, она сама по себе не корректна? 

не. речь о сравнении $_FILES[<some>]['type'] и $pathInfo['extension'], видимо. по крайней мере, файла с расширением "pjpeg" не встречал.
PM MAIL   Вверх
bars80080
Дата 23.1.2009, 14:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



т.е. функция is_uploaded_file() занимается сравнением $_FILES[<some>]['type'] и $pathInfo['extension']?
PM MAIL WWW   Вверх
skyboy
Дата 23.1.2009, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



уууууууууууууу.... 
почти рефлекс уже: проблема только в ИЕ - причина в нестандартном MIME-type.
А то, что у тебя в коде msg[6] выдается только при !is_uploaded_file, даже не посмотрел. 
Конечно, is_uploaded_file ничего не проверяет.

Добавлено через 1 минуту и 33 секунды
Цитата(skyboy @  23.1.2009,  14:04 Найти цитируемый пост)
ничего не проверяет

в смысле, MIME-типы тут ни при чем.

Добавлено через 3 минуты и 30 секунд
правда, я и не говорил, что ошибка в твоем коде. это уже потом, когда ты повел разговор о своем коде, я поленился в него заглянуть. а вообще - отвечал(да, да, домыслил сам, не видя кода) на 
 
Цитата(bazzjr @  23.1.2009,  04:04 Найти цитируемый пост)
немного дописал код под себя(ресайз добавил).
Только вот одно но - в IE6 пишет ошибку "Perhaps, attack throught upload" а в ФФ и Опере все нормуль!

подумал, что там появилась проверка на тип, оттого и не работает только под IE.
PM MAIL   Вверх
bars80080
Дата 23.1.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 71
Всего: 315



не, а что же всё-таки делает is_uploaded_file()?
в описании написано малопонятное:
Цитата
Возвращает TRUE, если файл filename был загружен при помощи HTTP POST. Это полезно, чтобы убедиться в том, что злонамеренный пользователь не пытается обмануть скрипт так, чтобы он работал с файлами, с которыми работать не должен -- к примеру, /etc/passwd. 


я так понимаю, просто вырубить её? не критично для файлов, которые будут просто отдаваться пользователям по ссылке на них?
PM MAIL WWW   Вверх
bazzjr
Дата 23.1.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 27.12.2007
Где: Россия, Пермь

Репутация: 4
Всего: 6



нееет... эта часть кода 

Код

for($i = 0; $i < $c; $i++) {
                if($type[$i] == $pathInfo['extension']) {
                    $flag = true; break; }}}
        if(!$flag) { $b = array(false, $msg[7]); return $b; }}


сравнивает значения в массиве т.е. jpg jpeg gif png. И  такое впечатление что и правда в ИЕ файлы jpg вовсе и не jpg а хз какие... 
Мне вот сравнение на типы файлов позарез нужно (да и очень небезопасно непровверять на типы)...
Кто подскажет как сравнивать для ИЕ???  (все таки "ишаГ"  блин smile )
PM MAIL ICQ   Вверх
skyboy
Дата 23.1.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(bars80080 @  23.1.2009,  14:25 Найти цитируемый пост)
не, а что же всё-таки делает is_uploaded_file()?

я так понимаю, проверяет, чтоб переданный аргумент(который совсем необязательно должен быть элементом массива $_FILES) указывает на существующий файл(соответственно, не нужна проверка на $_FILES[<some>]['error']) и находится в каталоге, указанном, как каталог для временных файлов.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1017 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.