Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.51/55: Рейтинг темы: голосов - 55, средняя оценка - 4.51
4 / 4 / 5
Регистрация: 20.09.2014
Сообщений: 307
1

Как узнать файл это картинка или нет

18.09.2016, 16:24. Показов 10532. Ответов 20
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
делаю загрузку файлов, есть вариант, но столкнулся с проблемой, файл картинка не показывает тип $_FILES['userfile']['type'] вообще... Может у кого есть другие решения?

PHP
1
if(($_FILES['userfile']['type'] == 'image/jpg' || $_FILES['userfile']['type'] == 'image/gif' || $_FILES['userfile']['type'] == 'image/jpeg' || $_FILES['userfile']['type'] == 'image/png') && ($_FILES['userfile']['size'] != 0 and $_FILES['userfile']['size']<=8388608))
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2016, 16:24
Ответы с готовыми решениями:

Как осуществлять проверку на то, картинка это или нет ?
Как осуществлять проверку на то, картинка это или нет, и если не картинка то вывести ошибку...

Как узнать ссылка это или файл из командной строки
Что такое символическая, жёсткая и т.д. ссылка объяснять не надо, как создаётся, какими утилитами,...

Как узнать является файл каталогом или нет?
Подскажите как узнать является ли файл каталогом или нет. через FindFirstFile() и FindNextFile()....

Как узнать, скачался файл из Интернета или нет?
Как узнать, скачался ли файл из Интернета или нет?

20
Заблокирован
18.09.2016, 16:35 2
По расширению.

Добавлено через 1 минуту
Вам в любом случае нужно делать проверку по расширению, чтобы не загрузили серверные скрипты и т.п.
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.09.2016, 16:43 3
Проверять размер функцией getimagesize, если функция вернула false - это не картинка.
0
шКодер самоучка
2262 / 1943 / 940
Регистрация: 09.10.2013
Сообщений: 4,332
Записей в блоге: 7
18.09.2016, 16:49 4
mozg-bolit, используйте класс finfo для определения MIME
PHP
1
2
3
4
5
6
7
<?php
 
$info = new \finfo(FILEINFO_MIME_TYPE);
$mime = $info->file(__FILE__);
list($type, $subtype) = explode('/', $mime, 2);
 
var_dump($mime, $type, $subtype);
1
Web Programmer
325 / 286 / 121
Регистрация: 28.09.2011
Сообщений: 1,570
18.09.2016, 17:06 5
mozg-bolit,
PHP/HTML
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
<?php
 
header("Content-Type: text/html;charset=windows-1251");
 
$up_exp = array('png', 'jpg', 'gif');
 
if($_SERVER['REQUEST_METHOD'] === 'POST') {
    try
    {
        $file = $_FILES['file'];
        $name = $file['name'];
        $type = strtolower(end(explode('.', $name)));
        if(!in_array($type, $up_exp))
            throw new Exception('Вы пытаетесь загрузить недоступный формат!');
        echo 'Файл успешно прошел проверку!';
    }catch(Exception $e) {
        echo '<p>Error: ' . $e->getMessage() . '</p>';
    }
}
 
?>
<form action="" method="POST" enctype="multipart/form-data">
    <input type="file" name="file" />
    <br />
    <button>Upload</button>
</form>
1
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
18.09.2016, 17:43 6
Цитата Сообщение от JimUSA Посмотреть сообщение
$type = strtolower(end(explode('.', $name)));
PHP
1
$type = pathinfo($name, PATHINFO_EXTENSION);
0
Software Engineer
289 / 252 / 53
Регистрация: 23.09.2014
Сообщений: 859
18.09.2016, 20:03 7
Цитата Сообщение от Jewbacabra Посмотреть сообщение
Проверять размер функцией getimagesize, если функция вернула false - это не картинка.
Лучше exif_imagetype
2
54 / 24 / 5
Регистрация: 21.02.2016
Сообщений: 234
19.09.2016, 00:11 8
я проверяю сами "буквы" в имени файла: если буквы jpg есть в имени файла,если есть буквы gif в имени файла

сам придумал,не хочу использовать этот "filename[type]" )

PHP
1
2
3
4
if(!preg_match('/mp3/',$u->file['name']) & !preg_match('/wav/',$u->file['name']) & !preg_match('/m4a/',$u->file['name']) & !preg_match('/gif/',$u->file['name']) & !preg_match('/png/',$u->file['name']) & !preg_match('/JPG/',$u->file['name']) & !preg_match('/jpg/',$u->file['name']) & !preg_match('/jpeg/',$u->file['name']) & !preg_match('/flv/',$u->file['name']) & !preg_match('/mp4/',$u->file['name']) & !preg_match('/avi/',$u->file['name'])) { 
 
 if(fwrite($openchatdb,date("G:i:s ")."Пользователь: ".$t." закачал файл: <a target=_blank href=http://liozenda.ru/sound/".$u->file['name']. ">".$u->file['name']."</a></font>\n")) {  }
}
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
19.09.2016, 00:58 9
PHP
1
!preg_match('/mp3/',$u->file['name']) & !preg_match('/wav/',$u->file['name']) & !preg_match('/m4a/',$u->file['name']) & !preg_match('/gif/',$u->file['name']) & !preg_match('/png/',$u->file['name']) & !preg_match('/JPG/',$u->file['name']) & !preg_match('/jpg/',$u->file['name']) & !preg_match('/jpeg/',$u->file['name']) & !preg_match('/flv/',$u->file['name']) & !preg_match('/mp4/',$u->file['name']) & !preg_match('/avi/',$u->file['name']
1) & и && - не одно и тоже
2) например такой файл пройдет проверку: mp3.php
3) Тогда уж
PHP
1
!preg_match('/.+\.(mp3|wav|m4a|и т.д)$/', $u->file['name']);
0
18 / 17 / 2
Регистрация: 11.01.2013
Сообщений: 109
19.09.2016, 11:54 10
Использовать проверку вхождения ключевого слова расширение файла - плохая практика. Как написано выше - проверять MIME type файла
0
Web Programmer
325 / 286 / 121
Регистрация: 28.09.2011
Сообщений: 1,570
19.09.2016, 14:05 11
nobodyvlv, и что же плохого?
0
18 / 17 / 2
Регистрация: 11.01.2013
Сообщений: 109
19.09.2016, 18:54 12
Цитата Сообщение от JimUSA Посмотреть сообщение
nobodyvlv, и что же плохого?
Залить вредоносный скрипт под "проверяемым" расширением не составит труда. Речь идет о безопасности ресурса, а быть может и всего сервера хостинга где крутится первый.
0
Заблокирован
19.09.2016, 19:11 13
nobodyvlv, вы не совсем правы. Сам MIME-тип часто определяется по расширению, так что это вас не спасет.

Добавлено через 1 минуту
Цитата Сообщение от nobodyvlv Посмотреть сообщение
Залить вредоносный скрипт под "проверяемым" расширением не составит труда.
Залить не составит, но это хотя бы воспрепятствует его выполнению.
1
18 / 17 / 2
Регистрация: 11.01.2013
Сообщений: 109
19.09.2016, 23:10 14
Цитата Сообщение от miketomlin Посмотреть сообщение
nobodyvlv, вы не совсем правы. Сам MIME-тип часто определяется по расширению, так что это вас не спасет.
Сменить вручную расширение, залить какой-то шелл и выполнить - вот цена проверки по расширению. Конкретно тот класс finfo_file() судя по документации читает байт массив заголовка файла и по нему определяет тип содержимого, а не по расширению. Это не раз разжовывалось и на форумах, и на хабре, и на stackoverflow - я просто не буду повторяться и пересказывать уже сказанные вещи. Да, может и не выполниться, но это при условии выставленных прав.

Вот выше человек тоже замечательную функцию предложил exif_imagetype() для заливаемых изображений.

Можно поступать иначе, если взять в рассчет "магические числа" https://en.wikipedia.org/wiki/... gic_number. Прочесть первые несколько байт и проверить по таблице нужные форматы https://en.wikipedia.org/wiki/... signatures. Но как по мне это садомазо, но имеет место жить и оно))
0
Заблокирован
19.09.2016, 23:21 15
Выполнить не получится при вменяемых настройках.
0
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
20.09.2016, 11:19 16
Не проверяйте по расширению. Я легко создам php файл с вредоносным кодом cool_image.png и залью его на сайт в этом случае. А потом у вас на сайте будет выводится такой html:
HTML5
1
<img src="uploads/cool_image.png" />
Скрипт мне на почту сольет всю вашу базу данных. А еще лучше удалит ее, чтобы никогда больше так не делали
И самое интересное, в конец файла я запихну такой код:
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$img = imagecreatetruecolor(1, 1);
$bg = imagecolorallocate($img, 255, 0, 255);
imagecolortransparent($img, $bg);
imagefilledrectangle($img, 0, 0, 1, 1, $bg);
header('Content-Type: image/png');
header("Expires: Thu, 19 Feb 1998 13:24:18 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-cache, must-revalidate");
header("Cache-Control: post-check=0,pre-check=0");
header("Cache-Control: max-age=0");
header("Pragma: no-cache");
echo imagepng($img);
exit();
Для пользователя и правда будет загружаться картинка Никто ничего не заметит.

Добавлено через 6 минут
И если логин и пароль от БД получить не удастся (обычно они хранятся в одном из файлов), то можно со злости грохнуть все файлы
0
18 / 17 / 2
Регистрация: 11.01.2013
Сообщений: 109
20.09.2016, 12:04 17
Цитата Сообщение от miketomlin Посмотреть сообщение
Выполнить не получится при вменяемых настройках.
А я о чем написал??
Цитата Сообщение от nobodyvlv Посмотреть сообщение
Да, может и не выполниться, но это при условии выставленных прав.
Спасибо, что поддержали мои слова)

Цитата Сообщение от Зверушь Посмотреть сообщение
Не проверяйте по расширению.
По этому поводу я и спорю, что это не лучшая практика.
0
4 / 4 / 5
Регистрация: 20.09.2014
Сообщений: 307
25.09.2016, 20:55  [ТС] 18
Пожалуйста можете скинуть пример с функцией exif_imagetype() ??
0
Эксперт PHP
5755 / 4134 / 1508
Регистрация: 06.01.2011
Сообщений: 11,276
25.09.2016, 21:07 19
Цитата Сообщение от mozg-bolit Посмотреть сообщение
пример с функцией exif_imagetype()
http://php.net/manual/ru/funct... e-examples
1
4 / 4 / 5
Регистрация: 20.09.2014
Сообщений: 307
25.09.2016, 22:42  [ТС] 20
Почему картинка выдает ошибку, я её как то не правильно переименовываю, почему картинка не показывается ?

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
if (exif_imagetype($_FILES['uploadfile']['tmp_name']) != IMAGETYPE_GIF and exif_imagetype($_FILES['uploadfile']['tmp_name']) != IMAGETYPE_JPEG and exif_imagetype($_FILES['uploadfile']['tmp_name']) != IMAGETYPE_PNG) {
    echo 'Для загрузки доступны только картинки формата GIF,JPEG и PNG'; 
 exit;
}
 
 
//папка для загрузки
$uploaddir = 'download/'.$_SESSION['id'].'/';
//новое сгенерированное имя файла
$newFileName='1.png';
//путь к файлу (папка.файл)
$uploadfile = $uploaddir.$newFileName;
 
//загружаем файл move_uploaded_file
if (move_uploaded_file($_FILES["uploadfile"]["tmp_name"], $uploadfile))
 echo "Выбранный файл загружен.\n";
else
 echo "Ошибка загрузки файла.\n";
 
//считываем содержания файла
$fp = fopen($uploadfile, 'r');
$contents = fread($fp, filesize ($uploadfile));
fclose($fp);
 
//чистим от php и html дескрипторов
$contents = strip_tags($contents);
$fp = fopen($uploadfile, 'w');
fwrite($fp, $contents);
fclose($fp);
echo'<img src="https://www.cyberforum.ru/'.$uploadfile.'" />';
0
25.09.2016, 22:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2016, 22:42
Помогаю со студенческими работами здесь

Как узнать, отправился ли файл на FTP-сервер или нет?
Всем привет. Из программы создаю bat-файл для отправки файла. Код файла send.bat : ftp -i...

Как посредством VBA узнать открыт XLS файл или нет
Как посредством VBA можно узнать открыт ли файл (Excel) или нет?

Как узнать сколько файлов в каталоге, и проверить, существует такой файл, или нет?
подскажите пожалуйста, как узнать сколько файлов в коталоге , и как проверить существует такой...

Узнать используется (записывается) файл или нет
В приложении 1н broadcast receiver записывает файл, 2й broadcast receiver загружает на сервер,...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru