Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Загрузка на сервер


Автор: chaos 18.10.2005, 08:15
Здрасте!!!! Давно я у Вас тут не был smile

Подскжите такую вещь: мне необходимо написать скриптик для загрузки jpg, gif, png на сервер
Меня интересует безопастность.
Те вопрос: Как обезопасить себя smile , сервер от всяких паразитов?

Добавлено @ 08:15
Если эта тема подымалась(искал вроде не нашел) прошу не бить

Заранее благодарен!!!

Автор: Mal Hack 18.10.2005, 09:57
Обезопасить легко. При загрузке не допускай закгрузку файлов с другими расширениями.
У нас вот есть в FAQ код: http://forum.vingrad.ru/index.php?showtopic=11017
Но для твоего случая хочу привести код своего товарища, который написан не так давно и более подходит для твоей задачи: http://trinex.ru/phpscripts/view/107/

Автор: -=Ustas=- 18.10.2005, 10:20
1. Проверка расширений, отсеивать исполняемые.
2. Переименовывать файлы при загрузке.
3. Менять права после загрузки.
4. Можно еще использовать для имен функции escapeshellarg() и escapeshellcmd().

Автор: chaos 18.10.2005, 11:34
спасибо!!!

Автор: chaos 21.10.2005, 11:26
Mal Hack
а чето я не понял я использую этот класс ClassUploadFiles
он что ли сначала загружает весь файл на сервер а потом определяет размер?
потому что сейчас проверил сунул ему файл размером гиг, и он начинает его грузить.

Как узнать размер до загрузки на сервер?

Автор: -=Ustas=- 21.10.2005, 11:31
Код

$_FILES['userfile']['size']

Автор: chaos 21.10.2005, 11:40
но почемуто этот класс
Код

<?php

/*
+---------------------------------------------
|   UploadFiles.class.php
|   ==========================================
|   by tRiNEX
|   2005 (c)
|   ==========================================
|   Web: http://www.trinex.ru
|   Email: trinex@yandex.ru
+---------------------------------------------
|
|   > Upload Files with web-interface.
|   > Date started: 18 Jule, 2005
|   > Filename: UploadFiles.class.php
|   > Version: 1.1
|
+---------------------------------------------

*/


/**
 * Класс для загрузки файлов через веб-интерфейс. Возможности: загрузка сразу нескольких файлов, проверка по расширеню файлов, проверка по размеру, проверка существования одноименного файла, выставление прав доступа.
 *
 */
Class Upload {

    /**
     * Массив имен полей в html форме.
     *
     * @var array of string
     */
    var $Files = array ( 'filename' );
    /**
     * Относительный или полный путь до директории загрузки.
     *
     * @var string
     */
    var $Dir = './uploads';
    /**
     * Опция, возможные варианты: 1\0. 1 - переименовывает загружаемые файлы по формату: годмесяцдень_***, где *** - случайные числа. 0 - загружает файлы с оригинальными именами.
     *
     * @var integer
     */
    var $UnicName = 1;
    /**
     * Опция, возможные варианты: 1\0. 1 - включает автовыставление прав доступа на файл. 0 - автовыставление выключено.
     *
     * @var integer
     */
    var $AutoChmod = 1;
    /**
     * Если опция AutoChmod включена, то будут выставлены права установленные в Chmod.
     *
     * @var integer
     */
    var $Chmod = 0644;
    /**
     * Опция, возможные варианты: 0\1\2. 0 - проверка на существование файла в загружаемой директории выключена, происходит перезапись файла, если файл существует.
     * 1 - проверка на существование файла включена, если файл существует, то вновь загружаемый файл загружен не будет.
     * 2 - ппроверка на существование файла включена, если файл существует, то вновь загружаемый файл будет переименован по формату имя_n, где 1,2,3..n и загружен.
     *
     * @var integer
     */
    var $CheckFile = 2;
    /**
     *  Массив разрешенных расширений файлов для загрузки.
     *
     * @var array of string
     */
    var $FilesExt = array ( 'gif', 'jpg', 'bmp' );
    /**
     * Максимальный размер загружаемых файлов в байтах.
     *
     * @var integer
     */
    var $MaxFileSize = 1024000000;
    /**
     * В данном массиве содержится информация о загруженных файлах (в случае успеха загрузки) или информация об ошибках (в случае неудачи).
     *
     * @var array of string
     */
    var $UploadedFiles;

    /**
     * Массив ошибок.
     *
     * @var array of string
     */
    var $ErrorsDesc = array (

    0 => 'Value: 0; There is no error, the file uploaded with success.',

    1 => 'Value: 1; The uploaded file exceeds the upload_max_filesize directive in php.ini.',
    2 => 'Value: 2; The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.',
    3 => 'Value: 3; The uploaded file was only partially uploaded.',
    4 => 'Value: 4; No file was uploaded.',
    5 => 'Value: 5; No file to upload',
    6 => 'Value: 6; Missing a temporary folder.',
    7 => 'Value: 7; Error of file extension.',
    8 => 'Value: 8; Error of file size',
    9 => 'Value: 9; Error of existing file. File already exist.'

    );

    /**
     * Главная функция класса, производит проверку и загрузку файлов, выставление прав, определение ошибок и т.д.
     *
     */
    function DoUpload () {

        @ set_time_limit ( 0 );

        foreach ( $this -> Files as $value ) {

            $flag = false;

            $filename = basename ( $_FILES[$value]['name'] );

            $file = $this -> _split_filename ( $filename );
            $ext = $file['ext'];
            $body = $file['body'];

            if ( ! in_array ( $ext, $this -> FilesExt ) ) {

                $this -> UploadedFiles[$value]['ErrorMsg'] = $this -> ErrorsDesc[7];

                $flag = true;

            }

            if ( $_FILES[$value]['name'] == '' ) {

                $this -> UploadedFiles[$value]['ErrorMsg'] = $this -> ErrorsDesc[5];

                $flag = true;

            }



            if ( $_FILES[$value]['size'] > $this -> MaxFileSize ) {


                $this -> UploadedFiles[$value]['ErrorMsg'] = $this -> ErrorsDesc[8];

                $flag = true;

            }


            $newname = ( $this -> UnicName == 1) ? date("ymd").'_'.mt_rand(100, 999).'.'.$ext : $filename;
            $file = $this -> _split_filename ( $newname );
            $body = $file['body'];
            $ext = $file['ext'];



            if ( is_file ( $this->Dir."/".$newname ) ) {

                if ( $this -> CheckFile == 1 ) {

                    $flag = true;
                    $this -> UploadedFiles[$value]['ErrorMsg'] = $this -> ErrorsDesc[9];

                } elseif ( $this -> CheckFile == 2 ) {

                    $i = 0;

                    while ( is_file ( $this->Dir."/".$newname ) ) {

                        $i++;
                        $newname = $body.'_'.$i.'.'.$ext;

                    }

                }

            }

            if ( ! $flag ) {
                if ( move_uploaded_file( $_FILES[$value]['tmp_name'], $this -> Dir."/".$newname ) ) {

                    $this -> UploadedFiles[$value]['Status'] = 1;
                    $this -> UploadedFiles[$value]['NewName'] = $newname;
                    $this -> UploadedFiles[$value]['Size'] = $_FILES[$value]['size'];

                    ($this -> AutoChmod == 1 ) ? @chmod ($this -> Dir."/".$newname, $this -> Chmod ) : '' ;

                } else {

                    $this -> UploadedFiles[$value]['ErrorMsg'] = $this -> ErrorsDesc[$_FILES[$value]['error']];

                }

            }

        }
    /**
     * Вспомогательная функция, возвращает массив, содержащий в себе расширение файла и тело имени файла.
     * image.gif -> ext = gif; body = image;
     *
     */}

    function _split_filename ( $file ) {

        $file = explode ( '.', $file);
        $ext = $file[ ( count ( $file ) - 1 ) ];
        unset ($file[ ( count ( $file ) - 1 ) ] );
        $name = implode ( '.', $file);
        $ret['ext'] = $ext;
        $ret['body'] = $name;

        return  $ret;

    }

}
?>    

пытается закачать большого размера файлы

вот сама форма
Код

<?php
require ("UploadFiles.class.php");


if ( isset ( $_POST['ok'] ) ) {
    
    $Upload  = new Upload();

    $Upload -> Files = array ('file1', 'file2');
    
    $Upload -> Dir = './uploads';
    
    $Upload -> UnicName = 0;
    $Upload -> AutoChmod = 1;
    $Upload -> Chmod =0644;
    $Upload -> CheckFile = 2;

    $Upload -> FilesExt = array ( 'gif', 'jpg' );
    $Upload -> MaxFileSize = 1024;

    $Upload -> DoUpload();
    
    print_r ($Upload -> UploadedFiles);
    
}
print '<form action="" method="post" enctype="multipart/form-data" name="upload_files" id="upload_files">
                   <input type="hidden" name="MAX_FILE_SIZE" value="1024">
             <table width="80%"  border="0" cellspacing="5" cellpadding="5">

               <tr>
                 <td rowspan="5" align="right" valign="top" class="tabl_4">Файлы для загрузки:</td>
                 <td class="tabl_4" align="left">                   <input name="file1" type="file" class="forminput" id="file1">                  </td>
               </tr>
               <tr>
                 <td class="tabl_4" align="left"><input name="file2" type="file" class="forminput" id="file2"></td>
               </tr>
               <tr align="center" valign="middle">
                 <td colspan="2" class="tabl_4"><input name="ok" type="submit" class="forminput" id="ok" value="Загрузить файлы"></td>
                </tr>
             </table>
 </form>';

?>

че не правельно??? или я гдето туплю???
Добавлено @ 11:46
вроде же написал максимальный размер 1024

Автор: chaos 21.10.2005, 12:18
помогите smile !!

Автор: -=Ustas=- 21.10.2005, 13:18
А ты не пробовал менять вот этот аттрибут класса:
Код

var $MaxFileSize = 1024000000;

на нужный размер тебе.

Автор: chaos 21.10.2005, 13:57
блиннн!!! smile smile smile
в этом и есть моя проблема?

Автор: -=Ustas=- 21.10.2005, 14:03
Цитата(chaos @ 21.10.2005, 13:57)
в этом и есть моя проблема?

Попробуй, узнаешь.

Автор: tRiNEX 21.10.2005, 18:28
Цитата

Опция MAX_FILE_SIZE является рекомендацией браузеру, даже если бы PHP также проверял это условие. Обойти это ограничение на стороне браузера достаточно просто, следовательно, вы не должны полагаться на то, что все файлы большего размера будут блокированы при помощи этой возможности. Тем не менее, ограничение PHP касательно максимального размера обойти невозможно. Вы в любом случае должны добавлять переменную формы MAX_FILE_SIZE, так как она предотвращает тревожное ожидание пользователей при передаче огромных файлов, только для того, чтобы узнать, что файл слишком большой и передача фактически не состоялась.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)