2012-02-16 3 views
1

У меня есть мой сайт, настроенный прямо сейчас, поэтому пользователь должен войти в систему (PHP + Cookies + SQL), чтобы просмотреть список файлов, доступных для них. Однако файлы загружаются в предсказуемый формат каталога, который после того, как пользователь узнает URL-адрес, может выставлять указанные файлы неавторизованному пользователю. Это просто PDF-файлы. Мне любопытно, как я должен защищать каталог, но я предполагаю, что это будет с .htaccess. Файлы связаны с помощью простых динамических тегов, которые извлекаются из базы данных. Есть ли безопасный и эффективный способ защиты целого каталога и позволяет зарегистрированным пользователям быстро просматривать ссылку, но перенаправлять неавторизованных пользователей на экран входа? Благодаря!PHP + htaccess: Защита файлов PDF

Zach

ответ

0

Сначала убедитесь, что список каталогов отключен для вашего веб-сервера. Это гарантирует, что никто не сможет просмотреть список всех ваших файлов.

Во-вторых, назовите файлы таким образом, чтобы его трудно было угадать. Не используйте простой идентификатор базы данных (например, 1.pdf и т. Д.) - либо используйте хеш-значение какого-то типа, либо имя, которое имеет какой-то смысл, но не легко угадывается.

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

top-secret-document-20120216-77-33.pdf 

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

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

+0

Hi Zaf, Спасибо за ответ. Имена файлов не всегда легко угадать, но у них есть конфиденциальная информация, и я надеялся на решение, которое полностью защитит их от несанкционированного пользователя (.htaccess, надеюсь) ... – Zakman411

+0

@ Zakman411 Я добавил кое-что о перемещении файлы в базу данных. Вы также можете проверить файлы cookie в htaccess. – zaf

+0

Хешированные имена работают особенно хорошо, если вы удаляете способность веб-сервера читать содержимое каталога через разрешения файловой системы: 'chmod 711/path/to/secret/directory' (при условии, что владелец _isn't_ является учетной записью пользователя веб-сервера).Для каталогов _traverse_ требуется только «x» выполнить доступ. – sarnold

0

Лучший способ сделать это - это использовать файлы с использованием PHP и запретить доступ к файлам PDF напрямую через ваш файл .htaccess с помощью FilesMatch.

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

<FilesMatch "\.(htaccess|htpasswd|pdf)$"> 
    Order Allow,Deny 
    Deny from all 
</FilesMatch> 
+0

да это было бы здорово - любая помощь? – Zakman411

+0

Ответ Mark R на самом деле имеет материал PHP, который вам нужен, и правило перезаписи, которое будет работать, но вам не нужно беспокоиться о том, чтобы помещать файлы вне вашего веб-корня, если вы добавляете код, который я добавил в свой ответьте на ваш файл .htaccess. Вы должны реалистично поместить код FilesMatch в файл .htaccess в каталог, в котором хранятся файлы PDF, чтобы он не оказывал непреднамеренного влияния на файлы, к которым вы не хотите отказывать. –

+0

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

3

Единственный реальный безопасный способ сделать это, чтобы поместить файлы вне веб-каталога рабочего и обслуживать их для зарегистрированных пользователей через файл PHP. Если вы хотите, чтобы файлы по-прежнему сохраняли расширение .pdf, вы могли бы использовать htaccess для перезаписи входящих имен PDF в ваш php-файл + несколько параметров.

.htaccess:

RewriteRule ^([A-Za-z0-9-]+).pdf$ index.php?filename=$1 [L,QSA] 

index.php:

if($logged_in){ 

    $temp_file = $_GET['filename']; 

    //make sure no one is trying to inject anything funny 
    $temp_file = str_replace('.','',$temp_file);    //prevent file path manipulation 
    $temp_file = str_replace('/','',$temp_file);    //prevent file path manipulation 
    $temp_file = str_replace('%00','',$temp_file);    //prevent null char injector 
    $temp_file = preg_replace('[^A-Za-z0-9]', '', $temp_file); //just to be sure 

$file = STORAGE_DIR.$temp_file.'pdf'; 

    if (file_exists(file)) { 
    header('Content-Description: File Transfer'); 
    header('Content-Type: application/octet-stream'); 
    header('Content-Disposition: attachment; filename='.basename($file)); 
    header('Content-Transfer-Encoding: binary'); 
    header('Expires: 0'); 
    header('Cache-Control: must-revalidate'); 
    header('Pragma: public'); 
    header('Content-Length: ' . filesize($file)); 
    ob_clean(); 
    flush(); 
    readfile($file); 
    exit; 
    } 
} 
else{ 

    header('Location: '.LOGIN_PAGE); 
    exit; 
} 
+0

Спасибо за ответ! Это похоже на возможность. Меня беспокоит только то, что моя система использует теги с заполнением PHP по пути «href» после вытаскивания списка из базы данных. Есть ли способ включить этот метод в тег ? – Zakman411

+1

Я не уверен, что буду следовать, если вы правильно реализуете этот метод, ваши ссылки не должны изменяться. Если ваша база данных тянет URL-адрес yourdomain.com/pdf-files/example.pdf, вы просто переместите все pdf-файлы в каталог pdf-файлов за пределы рабочего веб-каталога, а затем установите файл сценария и htaccess внутри pdf-файлов. – MarkR

+0

+1 для снятия с охраны :) – halfer

0

У меня есть голые кости РНР на основе загрузки системы, в которой безопасность пользователь может быть легко добавлены. Это here, если вы хотите взглянуть. Он использует Symfony 1.3 и Propel, поэтому вы можете подключить его к широкому спектру баз данных. Нет лицензии F/OSS, но я добавлю, если вы захотите!

Смежные вопросы