Проверьте расширение загрузки файлов (PHP / Jquery / Javascript) - PullRequest
1 голос
/ 10 марта 2011

В качестве заголовка какой из них лучше и почему?Есть ли слабости от этого?Я слышал, что проверка Jquery / Javascript плохая и рекомендовал использовать PHP, но почему-то не знаю почему ....

Нужна рекомендация от кого-либо из вас.Заранее спасибо.

Кто-нибудь посмотрит, хорошо это или плохо:

<input type="file" name="task_doc" class="task_doc"  onChange="checkext();"/>

function checkext(){
var permittedFileType = ['pdf', 'doc', 'docx', 'xls', 'xlsx'];
var fext = $(".task_doc").val().split('.').pop().toLowerCase();
var resultFile = validate_filetype(fext, permittedFileType);
    if(resultFile === false){
         $(".task_doc").replaceWith("<input type='file' name='task_doc'    class='task_doc'  onChange='checkext();'>");
        alert("Invalid Extension");

    }
    else{
        alert("Success");
    }
}

function validate_filetype(fext, ftype)
{
    for(var num in ftype)
    {
        if(fext == ftype[num])
            return true;
    }

    return false;
}

Ответы [ 2 ]

5 голосов
/ 10 марта 2011

Если вы используете только javascript для проверки достоверности данных, опытные пользователи будут иметь возможность загружать любые данные, которые они хотят.

С другой стороны, использование javascript может быть удобным способом получения быстрой обратной связи для пользователя, если введенные им данные (в данном случае файлы) недействительны.

Поэтому я предлагаю использовать как клиентские, так и серверные сценарии.

1 голос
/ 10 марта 2011

Вы должны предположить, что любые внешние данные испорчены и могут быть вредоносными. Пользователь может отключить JavaScript и отправить любой файл, который он хочет. Или пользователь может отправить файл на сервер и изменить тип и / или расширение MIME для обхода проверок на сервере.

Лучше всего убедиться, что ваш сервер настроен на правильную обработку различных типов MIME, а не по умолчанию анализировать неизвестные типы файлов как PHP. Другими словами, не устанавливайте Apache для обработки чего-либо, кроме файлов .php как PHP, и не блокируйте файлы .php от загрузки вообще. Обработка загрузки файлов - в лучшем случае непростая ситуация с точки зрения безопасности. Я настоятельно рекомендую сохранить загрузки вне корневого каталога вашего документа, переименовать их в случайную строку, которая известна только вам (например, при загрузке сохранить случайное имя в базе данных), а затем отправить файл через PHP в браузер.

header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename=' . basename($filename));
header('Content-Transfer-Encoding: binary');
readfile($filename);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...