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

Форум PHP

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

 

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

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

тема: Загрузка изображения на сервер
 
 автор: kvins   (10.03.2011 в 10:45)   письмо автору
 
 

сделал базовый скрипт(рабочий) который загружает картинки в нужную папку. но так как я делаю это в первый раз у меня есть пару вопросов
эти картинки будут в будущем аватаркой

1 это защита . какие проверки нужны? (не считая тех которые у меня есть)
я вот подумал ,если человек загрузит скрипт с расширением jpeg скрипт будет работать?

2 как передать ссылку файла в базу данных? (чтоб от туда брать картинку для каждого пользователя)

3 какие функции существуют чтоб подогнать любое фото для аватара (ну к примеру 200 на 150 )

image.php
<form enctype="multipart/form-data" action="load_image.php" method="POST">
 <input name="upload" type="file" />
    <input type="submit" name="send" value="Send File" />
</form>


load_image.php
if (isset($_POST['send']))
{
    $name = $_FILES['upload']['name'];
    $temp = $_FILES['upload']['tmp_name'];
     $type = $_FILES['upload']['type'];
    $size = $_FILES['upload']['size'];
    echo "$name<br>$temp<br>$type<br>$size";
    
    if ($type == "image/jpeg" || $type == "image/gif" || $type == "image/jpg" || $type == "image/png") {
        if ($size <= 4000000) { 
        if(is_uploaded_file($temp)) {        
        move_uploaded_file ($temp,"avatar/$name");
        }        else {echo "фото не загружено";}
        }
        else {exit ("простите но ваш файл превышает допустимую норму 4 мб");}
    }
    else {
        exit (" формат не подходит позволенно только jpg/ jpeg /gif /png");}
    }
    else {
        header ("Location: index.php");
        }
 

  Ответить  
 
 автор: Косорылый   (10.03.2011 в 11:23)   письмо автору
 
   для: kvins   (10.03.2011 в 10:45)
 

if ($type == "image/jpeg" || $type == "image/gif" || $type == "image/jpg" || $type == "image/png")

Бессмысленная проверка...заголовки проделываются

если очень надо отфильтровать ро расширению jpg/ jpeg /gif /png то лучше сделать ещё на стадии загрузки файла яваскриптом..(проверка в форме)

Воспользоваться библиотекой GD она работает только с изображениями..

  Ответить  
 
 автор: sim5   (10.03.2011 в 12:16)   письмо автору
 
   для: Косорылый   (10.03.2011 в 11:23)
 

>если очень надо отфильтровать ро расширению jpg/ jpeg /gif /png то лучше сделать ещё на стадии загрузки файла яваскриптом..(проверка в форме)

Вот как раз фильтрация у клиента это надежность? :)

  Ответить  
 
 автор: kvins   (10.03.2011 в 13:08)   письмо автору
 
   для: sim5   (10.03.2011 в 12:16)
 

то есть это и все?? 1 проверка на расширение файла?? а название файла?

  Ответить  
 
 автор: sim5   (10.03.2011 в 13:23)   письмо автору
 
   для: kvins   (10.03.2011 в 13:08)
 

А чем имя файла вам угрожает?
На клиенте не может быть никакой проверки в целях чего-то обезопасить, у клиента только сервис, и все проверки нужно делать на сервере.
Для проверки является ли файл файлом изображения и какого типа, существует стандартная функция getimagesize(), либо exif_imagetype().
Что касается именования, то именовать лучше под уникальным именем, который формирует сервер, так как нет гарантии того, что N пользователей не назовут свой файл одинаково. Оригинальное имя при этом тоже можно хранить, для определенных целей, но не как имя файла.

  Ответить  
 
 автор: kvins   (10.03.2011 в 13:33)   письмо автору
 
   для: sim5   (10.03.2011 в 13:23)
 

покажите пожалуйста как менять файл я попробовал так

$name = $_FILES['upload']['name'];         $name = 4; 


понятно что у меня он все изменил на это название включая формат=)

например человек захотел поменять аватар
как переписать файл по одинаковым названиям в папке которой они хранятся?

  Ответить  
 
 автор: sim5   (10.03.2011 в 13:47)   письмо автору
 
   для: kvins   (10.03.2011 в 13:33)
 

А что такое есть $_FILES['upload']['name']?

  Ответить  
 
 автор: kvins   (10.03.2011 в 13:51)   письмо автору
 
   для: sim5   (10.03.2011 в 13:47)
 

оригинальное название файла которое было на компе =)

  Ответить  
 
 автор: sim5   (10.03.2011 в 14:08)   письмо автору
 
   для: kvins   (10.03.2011 в 13:51)
 

И если вы это имя присваиваете другой переменной, разве оно может измениться от этого?
Перед тем как переместить загруженный файл из временной папки в рабочую, вы должны сформировать уникальное имя, под которым и переместить его. Либо вы при успешной загрузке делаете запись в базе, и для имени используете id этой записи. А оригинальное имя хранить в отдельном поле, если оно требуется.

  Ответить  
 
 автор: kvins   (10.03.2011 в 14:17)   письмо автору
 
   для: sim5   (10.03.2011 в 14:08)
 

а можете дать образец? чесно на практике не могу понять как это сделать
я даже не очень понимаю как проверять через getimagesize(),
нигде не нашел примеров использования этого


так правильно ?
  $size = $_FILES['upload']['size'];
  $size_img = getimagesize($size);
    if (($size_img[0]<10) && ($size_img[1]<10))   {echo "неподходящий размер файла ";}


а еще прочитал на 1 форуме

Но и то и другое не безопасно применять, если в $_FILES["img"]["type"] можно любое расширение вписать,
То при проверке getimagesize() в изображение можно "вклеить" шелл-код, и при этой проверке файл определится как изображение, а выполится как php, но это всё вкраце и размыто...

Методы защиты, это делать ресайз изображения, хотябы, на 1px, при этом из изображения удалится весь вредоносный код.

получается надо еще ресайз делать?

  Ответить  
 
 автор: sim5   (10.03.2011 в 15:08)   письмо автору
 
   для: kvins   (10.03.2011 в 14:17)
 

>а можете дать образец?

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

Функция getimagesize() возвращает массив информации об изображении, что еще может быть не понятного?

Этот вреденосный код, если он там будет, еще надо запустить как-то.

  Ответить  
 
 автор: kvins   (10.03.2011 в 15:29)   письмо автору
 
   для: sim5   (10.03.2011 в 15:08)
 

Функция getimagesize() возвращает массив информации об изображении, что еще может быть не понятного?

да это понятно что функция делает , можно понять просто если перевести слово , не могу понять как оно определят что картинка это картинка

  Ответить  
 
 автор: sim5   (10.03.2011 в 15:30)   письмо автору
 
   для: kvins   (10.03.2011 в 15:29)
 

А это вам зачем нужно? Если интересует, смотрите исходный код функции этой.

  Ответить  
 
 автор: kvins   (10.03.2011 в 15:49)   письмо автору
 
   для: sim5   (10.03.2011 в 15:30)
 

А это вам зачем нужно?
как зачем? странный вопрос а если я просто так напишу код а он на самом деле нечего не проверяет??

  Ответить  
 
 автор: sim5   (10.03.2011 в 15:55)   письмо автору
 
   для: kvins   (10.03.2011 в 15:49)
 

Какой код? Данная функция проверят то, для чего создна, и ваш код ей как-то....
У страха глаза велики, не читайте того, чего не понимаете.

  Ответить  
 
 автор: kvins   (10.03.2011 в 16:03)   письмо автору
 
   для: sim5   (10.03.2011 в 15:55)
 

спс от таких ответов у меня сразу пропали все вопросы и понятно как использовать getimagesize() больше нечего сказать

  Ответить  
 
 автор: sim5   (10.03.2011 в 16:05)   письмо автору
 
   для: kvins   (10.03.2011 в 16:03)
 

Так вы все в кучу не валите, и руки опускаться не будут.
Добавьте к своей картинке "код" и попробуйте его запустить. Вот как запустите, тогда можно и говорить об этом. Отделяйте мух от котлет.

  Ответить  
 
 автор: kvins   (10.03.2011 в 16:14)   письмо автору
 
   для: sim5   (10.03.2011 в 16:05)
 

ну делаю методом тыка , тока не спрашивайте что за фигню я делаю , ответ можно прочитать выше
загружаю нормальную картинку
если делаю так
$type = $_FILES['upload']['type'];
$type = getimagesize($type); то

Warning: getimagesize(image/png): failed to open stream: No such file or directory in w:\home\localhost\www\new\load_image.php on line 14
34.png
/tmp\php1F06.tmp

562245 формат не подходит позволенно только jpg/ jpeg /gif /png


если
$size = $_FILES['upload']['size'];

$size = getimagesize($size); то


Warning: getimagesize(562245): failed to open stream: No such file or directory in w:\home\localhost\www\new\load_image.php on line 14
34.png
/tmp\php1190.tmp
image/png

  Ответить  
 
 автор: cheops   (10.03.2011 в 16:31)   письмо автору
 
   для: kvins   (10.03.2011 в 16:14)
 

getimagesize() принимает в качестве аргумента путь к изображению. $_FILES['upload']['type'] и $_FILES['upload']['size'] - не содержат пути к загруженному изображению. Вам следует воспользоваться элементом $_FILES["filename"]["tmp_name"].

  Ответить  
 
 автор: kvins   (10.03.2011 в 16:53)   письмо автору
 
   для: cheops   (10.03.2011 в 16:31)
 

$temp = getimagesize($temp);

Notice: Array to string conversion in w:\home\localhost\www\new\load_image.php on line 19
>_< уже устал с утра вожусь с такой тупой маленькой проверкой. можете плиз показать пример?

  Ответить  
 
 автор: cheops   (10.03.2011 в 16:56)   письмо автору
 
   для: kvins   (10.03.2011 в 16:53)
 

У вас $temp является массивом, а функция getimagesize() в качестве аргумента принимает строку. Какова структура $temp? Возможно нужно передать какой-то элемент этого массива?

  Ответить  
 
 автор: kvins   (10.03.2011 в 17:05)   письмо автору
 
   для: cheops   (10.03.2011 в 16:56)
 

да знаю я это надо Индекс 2 это флаг, указывающий тип изображения.1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 =
и если я даже понимаю это серавно я не смогу это использовать никогда потому что ну незнаю как правильно прописать

  Ответить  
 
 автор: cheops   (10.03.2011 в 17:45)   письмо автору
 
   для: kvins   (10.03.2011 в 17:05)
 

Прописать что хотите и где? Вы хотите получить индекс или задача в чем-то другом? Чтобы получить флаг, указывающий на тип изображения можно воспользоваться следующей конструкцией
<?php
  
list($width$height$type$attr) = getimagesize($_FILES['upload']['tmp_name']);
?>

Переменная $type будет содержать нужный вам флаг. Или вы хотите использовать этот флаг для проверки того, какой тип файлов загружен?

  Ответить  
 
 автор: kvins   (10.03.2011 в 17:57)   письмо автору
 
   для: cheops   (10.03.2011 в 17:45)
 

ну косорылый написал что эта проверка бессмысленна

if ($type == "image/jpeg" || $type == "image/gif" || $type == "image/jpg" || $type == "image/png")

вот так мы и дошли до этой функции getimagesize


Или вы хотите использовать этот флаг для проверки того, какой тип файлов загружен?


да это и хочу

  Ответить  
 
 автор: cheops   (10.03.2011 в 18:15)   письмо автору
 
   для: kvins   (10.03.2011 в 17:57)
 

Тогда приведите это значение к целому числу
$type = intval($type);

и проверьте не является ли оно меньшим или равным нулю (так как все, что больше нуля вполне себе безопасные форматы)
if($type <= 0) exit("Загружен какой-то левый формат");

Но лучше действительно еще дополнительно проверить расширение файла.

  Ответить  
 
 автор: kvins   (10.03.2011 в 18:18)   письмо автору
 
   для: cheops   (10.03.2011 в 18:15)
 

ура спасибо =)

  Ответить  
 
 автор: sim5   (10.03.2011 в 16:31)   письмо автору
 
   для: kvins   (10.03.2011 в 16:14)
 

>да это понятно что функция делает

array getimagesize (string filename [, array imageinfo])

string filename - это строковое значение имени файла, а никак не типа, размера и еще бог весть чего. Это разве не понятно? Что у вас будет указывать на файл загруженный, разве не $_FILES['upload']['tmp_name']? А если оно, та разве ни его надо передавать аргументом этой функции? Только после того как вы укажете корректно файл этой функции, а не бог весть что, функция вернет массив:

из 4 элементов. Индекс 0 содержит ширину/width изображения в пикселах. Индекс 1 содержит высоту/height. Индекс 2 это флаг, указывающий тип изображения. 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(байтовый порядок intel), 8 = TIFF(байтовый порядок motorola), 9 = JPC, 10 = JP2, 11 = JPX. Индекс 3 это текстовая строка с корректной строкой height="yyy" width="xxx", которая может использоваться непосредственно в тэге IMG.

А проверив значения этого массива, вы будет знать и размеры файла, и тип его.

[поправлено модератором]

  Ответить  
 
 автор: kvins   (10.03.2011 в 17:03)   письмо автору
 
   для: sim5   (10.03.2011 в 16:31)
 

из 4 элементов. Индекс 0 содержит ширину/width изображения в пикселах. Индекс 1 содержит высоту/height. Индекс 2 это флаг, указывающий тип изображения. 1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 = BMP, 7 = TIFF(байтовый порядок intel), 8 = TIFF(байтовый порядок motorola), 9 = JPC, 10 = JP2, 11 = JPX. Индекс 3 это текстовая строка с корректной строкой height="yyy" width="xxx", которая может использоваться непосредственно в тэге IMG.

спс я в мануале тоже самое читал , но как их использовать примеров нет, ..........................

  Ответить  
 
 автор: sim5   (10.03.2011 в 17:09)   письмо автору
 
   для: kvins   (10.03.2011 в 17:03)
 

А какой вам еще пример нужен, если в описании написано, индекс 3 возвращаемого массива содержит указатель на тип, если это значение равно 1, то изображение GIF, если 2, то JPG, и так далее. Что нужно проверить чтобы знать какой тип?

http://ru.php.net/manual/en/function.getimagesize.php

  Ответить  
 
 автор: kvins   (10.03.2011 в 17:16)   письмо автору
 
   для: sim5   (10.03.2011 в 17:09)
 

как бы тупо это не звучало , я не знаю как правильно написать.

  Ответить  
 
 автор: kvins   (10.03.2011 в 13:18)   письмо автору
 
   для: Косорылый   (10.03.2011 в 11:23)
 

>>Бессмысленная проверка...заголовки проделываются

я вот подумал ,если человек загрузит скрипт с расширением jpeg скрипт будет работать?
это вы об этом?

  Ответить  
 
 автор: cheops   (10.03.2011 в 13:28)   письмо автору
 
   для: kvins   (10.03.2011 в 13:18)
 

Нет, не будет.

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

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