Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/21: Рейтинг темы: голосов - 21, средняя оценка - 4.95
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214

Как правильно проверять input type=file ?

17.09.2014, 22:41. Показов 4263. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уважаемые специалисты программировния подскажите как правильно проверить input type=file, то есть сделать все проверки чтобы при загрузке файла не было уязвимостей
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.09.2014, 22:41
Ответы с готовыми решениями:

Как правильно пользоваться тегом <input type="file"> ?
Добрый день. мне нужно передать файл в функцию. Файл выбирается с помощью формы. &lt;form enctype=&quot;multipart/form-data&quot;...

Как загрузить файл на сервер с помощю <input type=file>?
Как загрузить файл на сервер с помощю &lt;input type=file&gt; Например есть файл file.txt его надо загрузить на сервер Если можно небольшой...

<input type=file
&lt;form action=/?page=office&amp;action=add method=post enctype=multipart/form-data&gt; &lt;input type=file name=foto size=25...

18
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
17.09.2014, 23:19
в большинстве случаев достаточно getimagesize/exif_imagetype и проверки на имя файла
0
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214
17.09.2014, 23:29  [ТС]
а подробнее можно к примеру

PHP
1
<input type='file' name='avatar'>
а проверка вот такая только есть

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if (empty($_FILES['avatar']['type']))
    {
        echo "$<p class=wide_small><span class=attention>Ошибка!</span>Вы не выбрали фаил.</p>";
    }
 
if(!empty($_FILES['avatar']))
{
    if($_FILES["avatar"]["size"] > 0)
    {
           if($_FILES["avatar"]["size"] > 1024*1024*0.31)
           {
                {$err_message .= "<p class=kurs><span class=attention>Ошибка!</span>Файл очень велик. Разрешена загрузка баннеров не более чем в 300 килобайт.</p>";}
           }
          if(!getimagesize($_FILES["avatar"]["tmp_name"]))
          {
               echo "<span class=rur>Внимание!</span>Изображение аватар может иметь расширение только следующих типов: jpg, gif, png, jpeg.</p>";
          }
    }
}
мне кажется что этого мало

Добавлено через 46 секунд
достаточно ли ее или нет
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
17.09.2014, 23:33
Можно добавить такое
PHP
1
2
3
4
if(!preg_match('~\\.(?:jpe?g|png|gif)$~i', $_FILES['avatar']['name']))
{
//ошибка
}
И при перемещении не позволять вольностей в имени файла (лучше всего составлять свое имя файла)
1
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214
18.09.2014, 01:26  [ТС]
И при перемещении не позволять вольностей в имени файла (лучше всего составлять свое имя файла) ?

обясните что вы имеете введу

Добавлено через 4 минуты
вот еще проверка при добавлени в базу

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
if($_FILES["avatar"]["size"] > 0)
{
    if($_FILES["avatar"]["size"] > 1024*1024*0.31)
    {
        header("Location: ".$_SERVER['HTTP_REFERER']."&&err=1");
       exit;
    }
    if(!getimagesize($_FILES["avatar"]["tmp_name"]))
    {
        header("Location: ".$_SERVER['HTTP_REFERER']."&&err=2");
        exit;
    }
    if(copy($_FILES["avatar"]["tmp_name"],"upload/".$_FILES["avatar"]["name"]))
    {
       copy("upload/".$_FILES["avatar"]["name"],"images/banners/".$_FILES["avatar"]["name"]) or die("Не удается скопировать!");
            unlink("upload/".$_FILES["avatar"]["name"]);
            $startname = $_FILES['avatar']['name'];
            $filename=str_replace(" ","_",$startname);
            $lastname=substr(md5(time()),0,8)."_".translit($filename);
            rename($banner_path.$startname, $banner_path.$lastname);
     if(!getimagesize($banner_path.$lastname))
        {
           unlink($banner_path.$lastname);
           header("Location: ".$_SERVER['HTTP_REFERER']."&err=3");
           exit;
      }
    }
}
0
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
 Аватар для Tatikoma
260 / 224 / 109
Регистрация: 07.07.2014
Сообщений: 965
18.09.2014, 18:13
Цитата Сообщение от legio1milenium Посмотреть сообщение
copy
Не используйте copy в отношении загружаемых файлов. Используйте move_uploaded_file, иначе случится много всего нехорошего.

В таком виде реализация уязвима в случае IE6: пользователь может сгенерировать изображение таким образом, что оно будет содержать <script>alert("xss");</script>, при отображении этой картинки на вашем сайте в IE6 этот JavaScript будет исполнен и пользователю будет отображено модальное окно (в данном случае, по-факту - как минимум украдут куки, как максимум - сделают что угодно).

Кроме того, в случае наличия на вашем сайте уязвимости типа local include, - загрузку изображений можно использовать для загрузки shell'а, что не очень хорошо.

По-факту - лучше сохранять не исходное изображение, которое загрузил пользователь, а собственноручно перекодировать его с удалением информации exif (или, как минимум, её валидацией).

Цитата Сообщение от legio1milenium Посмотреть сообщение
PHP
1
copy("upload/".$_FILES["avatar"]["name"],"https://www.cyberforum.ru/images/banners/".$_FILES["avatar"]["name"])
Я конечно понимаю, что дальше по коду идет rename, однако до этого момент хакер может успеть обратится к загруженному изображению. Если оно содержит PHP-скрипт - все может кончится печально. Используйте сразу сгенерированное имя при перемещении изображения.

// ну и кроме всего прочего, - будет полезным запретить выполнение скриптов из директории с загружаемыми пользователем изображениями.
0
 Аватар для amamcham
11 / 11 / 1
Регистрация: 31.10.2013
Сообщений: 52
18.09.2014, 18:25
PHP
1
2
if(file_exists($img)) echo 'Ништяк';
else echo 'голяк';
0
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214
20.09.2014, 14:44  [ТС]
а это код надежен или в него еще что нибудь надо до писать для надежности
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)|(gif)|(GIF)|(png)|(PNG)$/',$_FILES['avatar']['name']))
{
                
    $filename = $_FILES['avatar']['name'];
    $source   = $_FILES['avatar']['tmp_name'];  
    $target   = $path_directory.$filename;
    move_uploaded_file($source, $target);
 
    if(preg_match('/[.](GIF)|(gif)$/', $_FILES['avatar']['name']))
    {
        $im = imagecreatefromgif($path_directory.$_FILES['avatar']['name']) ;
    }
    if(preg_match('/[.](PNG)|(png)$/', $_FILES['avatar']['name']))
    {
        $im = imagecreatefrompng($path_directory.$_FILES['avatar']['name']) ;
    }   
    if(preg_match('/[.](JPG)|(jpg)|(jpeg)|(JPEG)$/', $_FILES['avatar']['name']))
    {
        $im = imagecreatefromjpeg($path_directory.$_FILES['avatar']['name']); 
    }
                
    $w = 100;//ширина
    $w2 = 100; //высота 
    $w_src = imagesx($im); //вычисляем ширину
    $h_src = imagesy($im); //вычисляем высоту изображения
                
    if($w_src == $w and $h_src == $w2)
    {
        // запись в базу .......
    }
    else
    {
        echo "Не верный размер АВАТАР. Допустимый размер 100х100px";
    }
}
else
{
    echo "Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>";
}
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.09.2014, 14:56
он повторяющийся и не очень продуманный.. И я уже говорил, что не стоит полагаться на имя файла "как есть".
Хотя бы так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if(preg_match('/\\.(jpe?g|png|gif)$/i',$_FILES['avatar']['name'], $matches))
{
    $ext = $matches[1] == 'jpg' ? 'jpeg' : $matches[1];
    $filename = 'image' . time() . '.' . $ext;
    $create = 'imagecreatefrom' . $ext;
    $im = $create($_FILES['avatar']['tmp_name']);
    if(!$im)
    {
        //ошибка
    }
    else
    {
        move_uploaded_file($_FILES['avatar']['tmp_name'], $path_directory . $filename);
        $w = 100;//ширина
        $w2 = 100; //высота 
        list($w_src, $h_src) = getimagesize($_FILES['avatar']['tmp_name']);
        if($w_src == $w and $h_src == $w2)
        {
            // запись в базу .......
        }
        else
        {
            echo "Не верный размер АВАТАР. Допустимый размер 100х100px";
        }
        imagedestroy($im);
    }
}
else
{
    echo "Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>";
}
1
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214
20.09.2014, 20:31  [ТС]
а на сколько это эффективно и можно ли к этому дополнительно проверки дописать чтобы хотя бы 95% защетить можно конешно чтобы бы на 100% ))
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
20.09.2014, 20:34
На 100% невозможно защитить ничего.
Выше уже говорили, что еще можно делать
0
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214
21.09.2014, 00:39  [ТС]
полностью с вами согласен на 100% не че не возможно защетить но хотелось бы узнать ваше мнени по вашему коду на сколько он актуален по защите
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
21.09.2014, 00:41
Не знаю, я уже довольно давно не пишу на php и никогда особо не интересовался.. Хватало проверки на имя файла, тип файла и открытие с помощью getimagesize
0
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214
21.09.2014, 00:42  [ТС]
проверил работает но как его дальше можно обмануть пока что не представляю ведь пока учусь прграммироать а не ломать хотя как говорится кто-то делает бронежилет кто-то пулю которая пробьеть его всемирная гармони
0
F́́́́́́́ŕ́́́́́́́é́́́ ́ak
 Аватар для Tatikoma
260 / 224 / 109
Регистрация: 07.07.2014
Сообщений: 965
22.09.2014, 01:38
Позволю себе повторится:
Цитата Сообщение от Tatikoma Посмотреть сообщение
В таком виде реализация уязвима в случае IE6: пользователь может сгенерировать изображение таким образом, что оно будет содержать <script>alert("xss");</script>, при отображении этой картинки на вашем сайте в IE6 этот JavaScript будет исполнен и пользователю будет отображено модальное окно (в данном случае, по-факту - как минимум украдут куки, как максимум - сделают что угодно).
Кроме того, в случае наличия на вашем сайте уязвимости типа local include, - загрузку изображений можно использовать для загрузки shell'а, что не очень хорошо.
По-факту - лучше сохранять не исходное изображение, которое загрузил пользователь, а собственноручно перекодировать его с удалением информации exif (или, как минимум, её валидацией).
Поясняю, - да, IE6 не актуален, однако это лишь пример когда-то реально работающей уязвимости, через которую чего только не делали: нет никаких гарантий, что в современных браузерах не возникнет аналогичной уязвимости, соответственно защита от этого нужна.
Да, у вас наверняка нигде нет уязвимости типа local include, однако защита строится из многих уровней и этот один из них - нельзя давать пользователю загружать файлы с произвольным контентом, если есть такая возможность. Если возможности нет - файлы должны загружаться на отдельный сервер исполнение скриптов на котором невозможно в принципе.

Соответственно код может выглядеть так:
PHP
1
2
3
4
5
6
$im = @imagecreatefromstring(file_get_contents($_FILES[...]['tmp_name'])); // на самом деле может ничем хорошим не кончится, вспоминаем рекурсивные архивы и надеемся что тут нет аналогичной уязвимости, что к слову не факт - GIF'ы вроде тупо зипуются?)
@unlink($_FILES[...]['tmp_name']);
if(!is_resource($im)){
    throw new Exception('Incorrect image');
}
ImagePNG($im, '/path/to/uploads/' . mt_rand() . '.png'); // код так себе, нужно лучше генирировать случайное имя, это лишь для примера.
Т.е. вместо сохранения исходного изображения - загружаете его и кодируете заново, что существенно усложняет загрузку произвольного кода. И даже это не панацея, если вы читаете комменты к моему коду =)
0
3 / 3 / 4
Регистрация: 04.02.2013
Сообщений: 214
24.09.2014, 12:28  [ТС]
Tatikoma по данному коду можете что то прокоментировать чтобы еще дописали в него для дополнительно проверки что в нем не желательно использоватль
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if(preg_match('/\\.(jpe?g|png|gif)$/i',$_FILES['avatar']['name'], $matches))
{
    $ext = $matches[1] == 'jpg' ? 'jpeg' : $matches[1];
    $filename = 'image' . time() . '.' . $ext;
    $create = 'imagecreatefrom' . $ext;
    $im = $create($_FILES['avatar']['tmp_name']);
    if(!$im)
    {
        //ошибка
    }
    else
    {
        move_uploaded_file($_FILES['avatar']['tmp_name'], $path_directory . $filename);
        $w = 100;//ширина
        $w2 = 100; //высота 
        list($w_src, $h_src) = getimagesize($_FILES['avatar']['tmp_name']);
        if($w_src == $w and $h_src == $w2)
        {
            // запись в базу .......
        }
        else
        {
            echo "Не верный размер АВАТАР. Допустимый размер 100х100px";
        }
        imagedestroy($im);
    }
}
else
{
    echo "Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>";
}
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
24.09.2014, 12:49
Я там впопыхах несколько глупо сделал, лучше так
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if(preg_match('/\\.(jpe?g|png|gif)$/i',$_FILES['avatar']['name'], $matches))
{
    $ext = $matches[1] == 'jpg' ? 'jpeg' : $matches[1];
    $filename = 'image' . time() . '.' . $ext;
    $create = 'imagecreatefrom' . $ext;
    $im = $create($_FILES['avatar']['tmp_name']);
    if(!$im)
    {
        //ошибка
    }
    else
    {
        $w = 100;//ширина
        $w2 = 100; //высота 
        list($w_src, $h_src) = getimagesize($_FILES['avatar']['tmp_name']);
        if($w_src == $w and $h_src == $w2)
        {
            move_uploaded_file($_FILES['avatar']['tmp_name'], $path_directory . $filename);
            // запись в базу .......
        }
        else
        {
            echo "Не верный размер АВАТАР. Допустимый размер 100х100px";
        }
        imagedestroy($im);
    }
}
else
{
    echo "Аватар должен быть в формате <strong>JPG,GIF или PNG</strong>";
}
Хотя, в общем-то, можно обойтись и без getimagesize, пожалуй
0
24.09.2014, 18:37

Не по теме:

KOPOJI, раз уж грузишь ты аватарку в GD, ну чем тебе не сохранять её из него же?.. - Ну не надо пускать на сервер юзерский контент в чистом виде..

0
24.09.2014, 20:25

Не по теме:

Tatikoma, мне, в общем-то, все равно.. Говорите об этом ТС-у, он все рвется универсальный скрипт увидеть :)
З.Ы. Да, GD я подцепил по старой памяти - обычно я картинки всегда "ресайзю" до нужного размера. А тут оно, в общем-то, и не нужно.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
24.09.2014, 20:25
Помогаю со студенческими работами здесь

Сохранение пути input type file
Добрый вечер. Такая проблема: есть форма, которая сохраняет данные при ошибках (&gt;MAX количество символов и т.д.). На этой форме есть ...

Изменение изображения input type=file
Здравствуйте. Подскажите, как решить следующую проблему: Есть форма для записи авторов в БД &lt;form...

Input type file - выберите файл
Добрый вечер ув. пользователи! При клике на кнопку открывается мод. окно с формой, в которой есть input type file для фотографии. Весь код...

Как передать файл, полученый в <input type="file"> другой странице?
Через форму скрипту передаётся файл. Как получить тот же файл после повторной отправки формы, не вводя его повторно в поле. Пробовал так,...

Как по пути к файлу в интернете получить массив файла, как если бы он был загружен через <input type="file">?
Есть путь к файлу на чужом сайте, например &quot;http://site/pics/image34.jpeg&quot;. Нужно передать его функции, чтобы файл загрузился во временное...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
Программный отбор значений справочника
Maks 21.03.2026
Установка программного отбора значений справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит предопределенное значение перечислений. Процедура. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru