Ограничение доступа к файлам в определенной папке

12 янв. 2011 г., 05:57:54
Просмотры: 16.5K
Голосов: 2

Возможный дубликат:
Как защитить загрузки, если пользователь не авторизован?

Существует ли вообще способ ограничить прямой доступ к файлам в определенной папке только для определенных пользователей WordPress, у которых установлено это конкретное право?

2
Комментарии

Ограничить доступ к определенным PHP-файлам в директории? Или ко ВСЕМ файлам в директории?

MathSmath MathSmath
12 янв. 2011 г. 06:26:54

Ограничение доступа ко всем файлам в определенной директории от прямого доступа для всех, КРОМЕ пользователей с определенными правами.

NetConstructor.com NetConstructor.com
14 янв. 2011 г. 09:24:48
Все ответы на вопрос 1
1

Самое простое решение на PHP — создать скрипт для скачивания. Он проверяет права пользователя и отдает файл веб-клиенту. Либо, что предпочтительнее, разместить файлы в папке за пределами корневой директории веб-сервера.

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

header("Expires: 0"); 
header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
header("Cache-Control: private",false); 
header('Content-disposition: attachment; filename='. $file;
header("Content-Transfer-Encoding:  binary"); 
header("Content-Length: ". filesize(ABSPATH.$dir.$file); 
readfile($dir.$file);
exit();

Редактирование от 14-1:

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

if (move_uploaded_file( $_FILES['Filedata']['tmp_name'] , $upload_dir.$filename ) ) {
// код, выполняемый после успешного копирования файла. Обновите базу данных или что-то еще.
}

$upload_dir.$filename — это полный путь к директории за пределами папки www. Теперь файл доступен только веб-серверу. Сохраните его расположение в базе данных вместе с информацией о загрузившем пользователе. Или создайте подпапки для каждого пользователя. Вам нужно что-то, чтобы различать файлы разных пользователей.

Теперь, когда нужно скачать файл, создайте скрипт download.php. В этом скрипте проверьте, есть ли у пользователя права на файл.

global $user;
if ($user->id == $uploaded_user_id) {
    header("Expires: 0"); 
    header("Cache-Control: must-revalidate, post-check=0, pre-check=0"); 
    header("Cache-Control: private",false); 
    header('Content-disposition: attachment; filename='. $file;
    header("Content-Transfer-Encoding:  binary"); 
    header("Content-Length: ". filesize(ABSPATH.$upload_dir.$file); 
    readfile($upload_dir.$file);
    exit();
}

Теперь нужно передать file_id или имя файла в скрипт download.php. Сформируйте ссылку типа url/download.php?file=$file. Вы должны вызывать этот скрипт напрямую или на ранних этапах работы вашего плагина, иначе получите ошибку о том, что заголовки уже отправлены. Скрипт проверит права пользователя и начнет выводить бинарные данные.

Должно получиться примерно так. Надеюсь, это поможет. Это не полное решение, но оно даст вам старт.

12 янв. 2011 г. 10:45:31
Комментарии

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

NetConstructor.com NetConstructor.com
14 янв. 2011 г. 09:26:39