|
|
|
| сделал базовый скрипт(рабочий) который загружает картинки в нужную папку. но так как я делаю это в первый раз у меня есть пару вопросов
эти картинки будут в будущем аватаркой
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");
}
|
| |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 10:45)
| |
if ($type == "image/jpeg" || $type == "image/gif" || $type == "image/jpg" || $type == "image/png")
|
Бессмысленная проверка...заголовки проделываются
если очень надо отфильтровать ро расширению jpg/ jpeg /gif /png то лучше сделать ещё на стадии загрузки файла яваскриптом..(проверка в форме)
Воспользоваться библиотекой GD она работает только с изображениями.. | |
|
|
|
|
|
|
|
для: Косорылый
(10.03.2011 в 11:23)
| | >если очень надо отфильтровать ро расширению jpg/ jpeg /gif /png то лучше сделать ещё на стадии загрузки файла яваскриптом..(проверка в форме)
Вот как раз фильтрация у клиента это надежность? :) | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 12:16)
| | то есть это и все?? 1 проверка на расширение файла?? а название файла? | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 13:08)
| | А чем имя файла вам угрожает?
На клиенте не может быть никакой проверки в целях чего-то обезопасить, у клиента только сервис, и все проверки нужно делать на сервере.
Для проверки является ли файл файлом изображения и какого типа, существует стандартная функция getimagesize(), либо exif_imagetype().
Что касается именования, то именовать лучше под уникальным именем, который формирует сервер, так как нет гарантии того, что N пользователей не назовут свой файл одинаково. Оригинальное имя при этом тоже можно хранить, для определенных целей, но не как имя файла. | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 13:23)
| | покажите пожалуйста как менять файл я попробовал так
$name = $_FILES['upload']['name']; $name = 4;
|
понятно что у меня он все изменил на это название включая формат=)
например человек захотел поменять аватар
как переписать файл по одинаковым названиям в папке которой они хранятся? | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 13:33)
| | А что такое есть $_FILES['upload']['name']? | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 13:47)
| | оригинальное название файла которое было на компе =) | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 13:51)
| | И если вы это имя присваиваете другой переменной, разве оно может измениться от этого?
Перед тем как переместить загруженный файл из временной папки в рабочую, вы должны сформировать уникальное имя, под которым и переместить его. Либо вы при успешной загрузке делаете запись в базе, и для имени используете id этой записи. А оригинальное имя хранить в отдельном поле, если оно требуется. | |
|
|
|
|
|
|
|
для: 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, при этом из изображения удалится весь вредоносный код.
получается надо еще ресайз делать? | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 14:17)
| | >а можете дать образец?
Нет не могу, ибо чтобы выбрать именование файла, нужно знать условия загрузки их, как то одно изображение загружается или с сопутстствующей информацией. Если с ней, то является ли изображение обязательным условием при записи информации в базу. И так далее и тому подобное. А как я поступаю в этом случае писать не буду, ибо вы добросовестно скопируете, не поняв что к чему, а оно раз,... и не покатит в некотором случае.
Функция getimagesize() возвращает массив информации об изображении, что еще может быть не понятного?
Этот вреденосный код, если он там будет, еще надо запустить как-то. | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 15:08)
| | Функция getimagesize() возвращает массив информации об изображении, что еще может быть не понятного?
да это понятно что функция делает , можно понять просто если перевести слово , не могу понять как оно определят что картинка это картинка | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 15:29)
| | А это вам зачем нужно? Если интересует, смотрите исходный код функции этой. | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 15:30)
| | А это вам зачем нужно?
как зачем? странный вопрос а если я просто так напишу код а он на самом деле нечего не проверяет?? | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 15:49)
| | Какой код? Данная функция проверят то, для чего создна, и ваш код ей как-то....
У страха глаза велики, не читайте того, чего не понимаете. | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 15:55)
| | спс от таких ответов у меня сразу пропали все вопросы и понятно как использовать getimagesize() больше нечего сказать | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 16:03)
| | Так вы все в кучу не валите, и руки опускаться не будут.
Добавьте к своей картинке "код" и попробуйте его запустить. Вот как запустите, тогда можно и говорить об этом. Отделяйте мух от котлет. | |
|
|
|
|
|
|
|
для: 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
|
| |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 16:14)
| | getimagesize() принимает в качестве аргумента путь к изображению. $_FILES['upload']['type'] и $_FILES['upload']['size'] - не содержат пути к загруженному изображению. Вам следует воспользоваться элементом $_FILES["filename"]["tmp_name"]. | |
|
|
|
|
|
|
|
для: 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
>_< уже устал с утра вожусь с такой тупой маленькой проверкой. можете плиз показать пример? | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 16:53)
| | У вас $temp является массивом, а функция getimagesize() в качестве аргумента принимает строку. Какова структура $temp? Возможно нужно передать какой-то элемент этого массива? | |
|
|
|
|
|
|
|
для: cheops
(10.03.2011 в 16:56)
| | да знаю я это надо Индекс 2 это флаг, указывающий тип изображения.1 = GIF, 2 = JPG, 3 = PNG, 4 = SWF, 5 = PSD, 6 =
и если я даже понимаю это серавно я не смогу это использовать никогда потому что ну незнаю как правильно прописать | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 17:05)
| | Прописать что хотите и где? Вы хотите получить индекс или задача в чем-то другом? Чтобы получить флаг, указывающий на тип изображения можно воспользоваться следующей конструкцией
<?php
list($width, $height, $type, $attr) = getimagesize($_FILES['upload']['tmp_name']);
?>
|
Переменная $type будет содержать нужный вам флаг. Или вы хотите использовать этот флаг для проверки того, какой тип файлов загружен? | |
|
|
|
|
|
|
|
для: cheops
(10.03.2011 в 17:45)
| | ну косорылый написал что эта проверка бессмысленна
if ($type == "image/jpeg" || $type == "image/gif" || $type == "image/jpg" || $type == "image/png")
|
вот так мы и дошли до этой функции getimagesize
Или вы хотите использовать этот флаг для проверки того, какой тип файлов загружен?
да это и хочу | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 17:57)
| | Тогда приведите это значение к целому числу
и проверьте не является ли оно меньшим или равным нулю (так как все, что больше нуля вполне себе безопасные форматы)
if($type <= 0) exit("Загружен какой-то левый формат");
|
Но лучше действительно еще дополнительно проверить расширение файла. | |
|
|
|
|
|
|
|
для: cheops
(10.03.2011 в 18:15)
| | ура спасибо =) | |
|
|
|
|
|
|
|
для: 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.
А проверив значения этого массива, вы будет знать и размеры файла, и тип его.
[поправлено модератором] | |
|
|
|
|
|
|
|
для: 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.
спс я в мануале тоже самое читал , но как их использовать примеров нет, .......................... | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 17:03)
| | А какой вам еще пример нужен, если в описании написано, индекс 3 возвращаемого массива содержит указатель на тип, если это значение равно 1, то изображение GIF, если 2, то JPG, и так далее. Что нужно проверить чтобы знать какой тип?
http://ru.php.net/manual/en/function.getimagesize.php | |
|
|
|
|
|
|
|
для: sim5
(10.03.2011 в 17:09)
| | как бы тупо это не звучало , я не знаю как правильно написать. | |
|
|
|
|
|
|
|
для: Косорылый
(10.03.2011 в 11:23)
| | >>Бессмысленная проверка...заголовки проделываются
я вот подумал ,если человек загрузит скрипт с расширением jpeg скрипт будет работать?
это вы об этом? | |
|
|
|
|
|
|
|
для: kvins
(10.03.2011 в 13:18)
| | Нет, не будет. | |
|
|
|