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

Форум PHP

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

 

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

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

тема: Безопасная загрузка изображений
 
 автор: Василий   (01.01.2012 в 09:24)   письмо автору
 
 

Прочитал наhttp://habrahabr.ru/blogs/php/44610/
Безопасная загрузка изображений на сервер.
Возникло желание в скрипт, скаченный на этом форуме, внести защиту
Помогите, пожалуйста, объединить 2 файла в один
<html>
<head>
  <title>Результат загрузки файла</title>
</head>
<body>
<?php
   
if($_FILES["filename"]["size"] > 1024*3*1024)
   {
     echo (
"Размер файла превышает три мегабайта");
     exit;
   }
   
// Проверяем загружен ли файл
   
if(is_uploaded_file($_FILES["filename"]["tmp_name"]))
   {
     
// Если файл загружен успешно, перемещаем его
     // из временной директории в конечную
  
move_uploaded_file($_FILES["filename"]["tmp_name"], $_SERVER['DOCUMENT_ROOT'].'/upload/'.$_FILES["filename"]["name"]); 
   } else {
      echo(
"Ошибка загрузки файла");
   }
   
   echo 
$_SERVER['DOCUMENT_ROOT'].'/upload/'.$_FILES["logo"]["name"]; 
   
var_dump($_FILES);
   
   echo 
"temp file: ",$_FILES["filename"]["tmp_name"], "<br>";
echo 
"new file:  "$_SERVER['DOCUMENT_ROOT'].'/upload/'.$_FILES["filename"]["name"]; 
?>

</body>
</html>


<?php

 $blacklist 
= array(".php"".phtml"".php3"".php4");

 foreach (
$blacklist as $item) {

  if(
preg_match("/$item\$/i"$_FILES['userfile']['name'])) {

   echo 
"We do not allow uploading PHP files\n";

   exit;

   }

  }



  
$uploaddir 'uploads/';

  
$uploadfile $uploaddir basename($_FILES['userfile']['name']);



  if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {

   echo 
"File is valid, and was successfully uploaded.\n";

  } else {

   echo 
"File uploading failed.\n";

  }

?>

  Ответить  
 
 автор: Slo_Nik   (01.01.2012 в 13:49)   письмо автору
 
   для: Василий   (01.01.2012 в 09:24)
 

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

  Ответить  
 
 автор: Tamplier   (03.01.2012 в 13:39)   письмо автору
 
   для: Василий   (01.01.2012 в 09:24)
 

Да защита в этом скрипте "очень хорошая", php не грузим, а js к примеру - запросто...
Очень безопасно, тем паче что изображения не перерисовываются, а тупо забрасываются.
Если после установки этого php "шедевра" вас ломанут, вы особо не удивляйтесь!

P.S. Эту тему правильней переименовать - Опасная загрузка изображений

  Ответить  
 
 автор: Василий   (03.01.2012 в 15:21)   письмо автору
 
   для: Tamplier   (03.01.2012 в 13:39)
 

"Опасная загрузка изображений" - это в первом коде? Если да, то что добавить в этот код из второго кода?

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 15:35)   письмо автору
 
   для: Василий   (03.01.2012 в 15:21)
 

>Если да, то что добавить в этот код из второго кода?
Ни чего ....
Вернее во втором коде только проверка расширения файла, но этого крайне недостаточно.
Я Вам дал ссылку, смотрите ещё раз внимательно. перечитайте статью ещё раз на хабре, обратите внимание на функцию getimagesize();

  Ответить  
 
 автор: Василий   (03.01.2012 в 15:40)   письмо автору
 
   для: Slo_Nik   (03.01.2012 в 15:35)
 

<?php 


/**  
 * Function of uploaded of a file   
 * Функция загрузки файла (аплоадер)  
 * @param  int    $max_file_size    максимальный размер файла в килобайтах  
 * @param  array  $valid_extensions массив допустимых расширений  
 * @param  string $upload_dir       директория загрузки  
 * @return array                    сообщение о ходе выполнения  
 *  
 * @author IT studio IRBIS-team (www.irbis-team.com)  
 * @copyright © 2009 IRBIS-team   
 */  
    
function uploadHandle($max_file_size 100$valid_extensions = array(), $upload_dir '.')  
    {  
      
        
$error null;  
        
$info  null;  
        
$max_file_size *= 1024;  

        if (
$_FILES['userfile']['error'] === UPLOAD_ERR_OK)  
        {  
            
// проверяем расширение файла  
            
$file_extension pathinfo($_FILES['userfile']['name'], PATHINFO_EXTENSION);  
            if (
in_array($file_extension$valid_extensions))  
            {  
                
// проверяем размер файла  
                
if ($_FILES['userfile']['size'] < $max_file_size)  
                {  
                    
$destination $upload_dir .'/' $_FILES['userfile']['name'];  
      
                    if (
move_uploaded_file($_FILES['userfile']['tmp_name'], $destination))  
                        
$info 'Файл успешно загружен';  
                    else  
                        
$error 'Не удалось загрузить файл';  
                }   
                else  
                    
$error 'Размер файла больше допустимого';  
            }   
            else  
                
$error 'У файла недопустимое расширение';  
        }   
        else  
        {  
            
// массив ошибок  
            
$error_values = array( 

                
UPLOAD_ERR_INI_SIZE   => 'Размер файла больше разрешенного директивой upload_max_filesize в php.ini',  
                
UPLOAD_ERR_FORM_SIZE  => 'Размер файла превышает указанное значение в MAX_FILE_SIZE',                            
                
UPLOAD_ERR_PARTIAL    => 'Файл был загружен только частично',   
                
UPLOAD_ERR_NO_FILE    => 'Не был выбран файл для загрузки',   
                
UPLOAD_ERR_NO_TMP_DIR => 'Не найдена папка для временных файлов',   
                
UPLOAD_ERR_CANT_WRITE => 'Ошибка записи файла на диск' 

                                  
);  
      
            
$error_code $_FILES['userfile']['error'];  
      
            if (!empty(
$error_values[$error_code]))  
                
$error $error_values[$error_code];  
            else  
                
$error 'Случилось что-то непонятное';  
        }  
      
        return array(
'info' => $info'error' => $error);  
    }  
      
/////////////////////////////////////////////////////////////////////      
    
$extensions = array('jpg''jpeg''png''gif');  
    
$upload_dir 'images';  
      
    
// Запускаем функцию  
    
if(!empty($_POST['upload_submit'])) 
    {      
        
$message uploadHandle(200$extensions$upload_dir);  
    
        
// Выводим сообщение  
        
echo $message['error'] ? $message['error'] : $message['info'];  
    } 
?>  

<form action="" method="post" enctype="multipart/form-data">  
    <input type="file" name="userfile" />  
    <input type="submit" value="Закачать" name="upload_submit" />  
</form>


Warning: move_uploaded_file(images/yutex.png) [function.move-uploaded-file]: failed to open stream: Permission denied in..... on line 33

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/tmp/phpuOvTOz' to 'images/yutex.png' in .....on line 33
Не удалось загрузить файл

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 15:47)   письмо автору
 
   для: Василий   (03.01.2012 в 15:40)
 

А о чём говорит ошибка Вы потрудились узнать?
Эта ошибка возникла из-за того, что Вы не думая скопировали скрипт..... Так он у Вас не заработает.
Где Вы тестируете скрипт, на локальном или на реальном хостинге?

  Ответить  
 
 автор: Василий   (03.01.2012 в 15:51)   письмо автору
 
   для: Slo_Nik   (03.01.2012 в 15:47)
 

на хостинге

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 15:52)   письмо автору
 
   для: Василий   (03.01.2012 в 15:51)
 

так о чём же говорит ошибка? )))

  Ответить  
 
 автор: Василий   (03.01.2012 в 15:54)   письмо автору
 
   для: Slo_Nik   (03.01.2012 в 15:52)
 

Если все прошло без ошибок, то перемещаем файл из временной папки в нужную нам. Для этого используем
move_uploaded_file($filename, $destination), где $filename - путь к файлу, который надо переместить, а $destination - путь, куда мы хотим сохранить наш файл вместе с именем.

Вопрос.
1) НАдо ли создавать временную папку?

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 15:56)   письмо автору
 
   для: Василий   (03.01.2012 в 15:54)
 

временную папку создавать не надо, вот выставить права доступа к той директории, в которую Вы загружаете файлы, надо. Установить можно через ftp клиент
Об этом Вам и было сказано в ошибке

  Ответить  
 
 автор: Василий   (03.01.2012 в 15:57)   письмо автору
 
   для: Василий   (03.01.2012 в 15:54)
 

$destination = $upload_dir .'/' . $_FILES['userfile']['name'];

Файлы должны записываться в эту папку img/logo

Значит будет вот так?

$destination = $ img/logo .'/' . $_FILES['userfile']['name'];

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 16:02)   письмо автору
 
   для: Василий   (03.01.2012 в 15:57)
 

а Вы попробуйте, и получите скорей всего очередную ошибку....
$destination ="img/logo/' . $_FILES['userfile']['name']; вот так будет правильней

  Ответить  
 
 автор: Василий   (03.01.2012 в 16:05)   письмо автору
 
   для: Slo_Nik   (03.01.2012 в 16:02)
 

так дает ошибку
Parse error: syntax error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in.... line 31

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 16:06)   письмо автору
 
   для: Василий   (03.01.2012 в 16:05)
 

как так?
если Вы о том, что писал я, то там проблема в кавычках, исправьте и синтактическая ошибка уйдёт

  Ответить  
 
 автор: Василий   (03.01.2012 в 16:10)   письмо автору
 
   для: Slo_Nik   (03.01.2012 в 16:06)
 

                $destination ="img/logo/' . $_FILES['userfile']['name']"; 


А как кавычки исправить?

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 16:12)   письмо автору
 
   для: Василий   (03.01.2012 в 16:10)
 

>А как кавычки исправить?
Вы отлично шутите, я оценил ))))

Так же исправить, как и любой символ в редакторе при опечатке ))))

  Ответить  
 
 автор: Василий   (03.01.2012 в 16:15)   письмо автору
 
   для: Slo_Nik   (03.01.2012 в 16:12)
 

Вопрос задам по-другому.
Вы предложили:
$destination ="img/logo/' . $_FILES['userfile']['name'];
Но одной " не хватает. Убрал ее - ошибка. Добавляю в конец - ошибка

  Ответить  
 
 автор: Slo_Nik   (03.01.2012 в 16:18)   письмо автору
 
   для: Василий   (03.01.2012 в 16:15)
 

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

  Ответить  
 
 автор: Василий   (03.01.2012 в 16:27)   письмо автору
 
   для: Slo_Nik   (03.01.2012 в 16:18)
 

файл закачал.
Спасибо.
Успехов

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

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