Загрузка PDF или .doc и безопасность - PullRequest
4 голосов
/ 28 мая 2010

У меня есть скрипт, который позволяет пользователю загружать текстовые файлы (PDF или doc) на сервер, затем планируется преобразовать их в необработанный текст. Но до тех пор, пока файл не будет конвертирован, он находится в исходном формате, что заставляет меня беспокоиться о вирусах и всевозможных неприятностях.

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

Ответы [ 6 ]

4 голосов
/ 28 мая 2010

Как я прокомментировал Aerik, но это действительно ответ на вопрос.

Если у вас PHP> = 5.3, используйте finfo_file(). Если у вас более старая версия PHP, вы можете использовать mime_content_type() (менее надежный) или загрузить расширение Fileinfo из PECL.

Обе эти функции возвращают MIME-тип файла (просматривая тип данных внутри них). Для PDF это должно быть

text/pdf

Для слова doc это может быть несколько вещей. Как правило, это должно быть

application/msword

Если ваш сервер работает * nix, убедитесь, что сохраняемые файлы не являются исполняемыми. Еще лучше: сохраните их в папку, которая недоступна веб-серверу. Вы все еще можете написать код для доступа к файлам, но кто-то, запрашивающий веб-страницу, не сможет получить к ним доступ вообще.

2 голосов
/ 28 мая 2010

Если вы когда-либо открывали или выполняли какой-либо загруженный пользователем файл на сервере, вы должны ожидать, что ваш сервер теперь взломан.

Даже JPG может содержать исполняемый файл php. Если вы include или require файл каким-либо образом в вашем скрипте, это также может поставить под угрозу ваш сервер. Изображение, на которое вы наткнулись в Интернете, выглядело так ...


header('Content-type: image/jpeg');
header('Content-Disposition: inline; filename="test.jpg"');

echo file_get_contents('/some_image.jpg');
echo '<?php phpinfo(); ?>';

... который вы сохраняете и повторно размещаете на своем собственном сервере, вот так ...


$q = $_GET['q']; // pretend this is sanitized for the moment
header('Content-type: '.mime_content_type($q));
header('Content-Disposition: inline; filename="'.$_GET['q'].'"');

include $q;

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

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

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

1 голос

Если вы просматриваете PDF, вы ничего не можете сделать, кроме как получить антивирус и молиться , чтобы он злонамеренно ловил сформированный PDF.

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


О, вы беспокоитесь о сервере . Только не запускайте загруженные файлы ...

1 голос
/ 28 мая 2010

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

1 голос
/ 28 мая 2010

Hum - imho, вам не нужно беспокоиться о типе документа или о чем-то подобном; если вы используете хороший конвертер для преобразования в необработанный текст, то этот должен выполнять эти проверки без сбоя сервера.

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

Я никогда не видел, чтобы веб-приложение выполняло подобные проверки - а вы?

0 голосов
/ 14 мая 2016

в загруженном файле есть 3 способа защиты: лучше всего: поместить файл на другой сервер, наиболее безопасный лучше: поместите их вне вашей WWW-папки, это означает, что никто не сможет получить к ним доступ по URL, и вы должны использовать readfile () или get_content для чтения и показа файлов. последнее: поместите файлы в WWW и используйте .htaccess в папку, которая мешает другим запускать файлы или помещать неизвестные файлы это то, что я делаю, загружая файлы; поместите их вне веб-корня и переименуйте их, даже сохраните поддельное имя в базе данных и создайте реальное имя файла по алгоритму.

после загрузки файла вне веб-корня вы можете получить к нему доступ, как и здесь. Вот содержимое файла caleed getfile.php:

    <?php

    define('DS', DIRECTORY_SEPARATOR);
//fake name of file
    $uniqueid = $_GET['uniqueid'];
//file extension
    $ext = $_GET['ext'];
    if (isset($_GET['dir']))
//check address doenot contain ..
        $addrss = str_replace('..', '_', $_GET['dir']);
    $baseaddress = '..' . DS . 'foldername outside of web root';
    if ((isset($_GET['uniqueid']) and strlen($uniqueid) === 32) and ( isset($_GET['ext']) and strlen($ext) === 3 )) {
        $path = $baseaddress . DS . $addrss . DS;
        $path .= md5($uniqueid . $uniqueid . $uniqueid . $ext.'*#$%^&') .'.'. $ext;
        if (file_exists($path)) {
    //you can check for all your accessible extension i just use for img
            switch ($ext) {
                case 'jpg':
                    $content_type = 'image/jpeg';
                    break;
                case 'png':
                    $content_type = 'image/png';
                    break;
                case 'gif':
                    $content_type = 'image/gif';
                    break;
            }
            header('Content-type: ' . $content_type . ' ');
            $file = readfile($path);
        }

в файле src или в любом месте, где вам нужно показать файл, сделайте это (это для моих изображений):

<img src="/getfile.php?uniqueid=put fake file name here&amp;ext=put extension here&amp;dir=put rest of file address here" >

надеюсь, это поможет вам. Не стесняйтесь задавать дополнительные вопросы

...