Загрузив файл на сервер


Я написал простой PHP-скрипт, который позволяет пользователю загрузить файл на сервер. Это работает, но я не очень уверен в безопасности. Не могли бы вы дать мне некоторые подсказки об ошибках безопасности?

В двух словах: пользователь загружает файл из form.html тогда файл сохраняется в загрузки/ директории на сервере, и прямая ссылка на него записывается в базу данных. Тогда эта ссылка для пользователя, чтобы он/она может загрузить файл. Выполнение этого файла запрещено использование .реврайт.

form.html

<div id="quickFileSubmit" style="margin-left: 20px; display: none">
    <table>
        <tr>
            <td>
                <form enctype="multipart/form-data" class="smallForm"
                      action="action.php?act=quickFileSubmit" method="post"
                      style="margin-top: 5px;">
                    <label style="font-size: 12px;">File:</label>
                    <input type="file" name="uploadfile" readonly="true" size="30"/>
                    <input type="submit" value="Submit" />
                </form>
            </td>
            <td style="width: 100%;"></td>
        </tr>
    </table>
</div>

action.php

//some actions

else if ($_REQUEST["act"] == "quickFileSubmit") {
    $basename = getUploadBasename();
    uploadFile();
    header("location:index.php");
}

function uploadFile() {

    if (strlen($_FILES['uploadfile']["name"]) > 0) {
        $target_path = "uploads/";
        $basename = basename( $_FILES['uploadfile']['name']);
        $target_path = $target_path . $basename;
        if (encode($basename) == $basename) {
            if(move_uploaded_file($_FILES['uploadfile']['tmp_name'], $target_path)) {

                // here goes saving of file info

                return $basename;
            } else{
                // upload failed.
                echo "File upload failed.";
                return null;
            }
        } else {
            echo "Illegal characters in file name.";
            return null;
        }
    }
}

Кроме того, я поставил .htaccess в загружает реж:

.реврайт

SetHandler default-handler
Options -Indexes


Комментарии
1 ответ

Одна вещь, которая сразу выделяется для меня, является ли переменную$_FILES['протоколу'] на самом деле существует для каждого отправляемого запроса. Сделать isset и на нем первой, чтобы убедиться, что клиент не отправить пост с производство входных значений - например: некоторые пользовательские HTML-форм собственного изготовления. Если они это сделают, вы будете получать 'функция ожидает какое-то значение, логическое значение/значение null, учитывая ошибки все на месте, как это.

Или еще лучше, чтобы позволить клиенту гибкость, если они захотят использовать какой-то API для вашего сайта, просто цикл через переменную$_FILES массив работы над тем, что файлы, которые они представляют этот скрипт. Ваш выбор, хотя если вы хотите вместо того, чтобы поддерживать строгий входной сигнал, но это не так важно, как долго, как ваш скрипт получает на вход файл в поле под названием "протоколу" от любого источника.

Кроме того, в переменную$_FILES[$х]["имя"], проверить или очистить его, чтобы убедиться, что он содержит только буквы, цифры, подчеркивания, тире и точка символами. Да ОС может работать с большим количеством символов, чем это, но не каждый протокол или приложение может (текст, браузеры, редакторы или электронной почте ломая длинные имена файлов или ссылок на места и т. д.).

3
ответ дан 24 марта 2011 в 02:03 Источник Поделиться