2017-01-14 3 views
2

У меня есть папка, в которой я сохраняю файлы. Доступ к этим файлам осуществляется с веб-страницы. Предположим, что каталог похож на manual/fileName.pdf.Защитить файл от прямого доступа

У меня также есть страница, которая показывает список сохраненных файлов в папке manual/, и эта страница защищена с использованием пользовательских сеансов. Поэтому перед доступом к странице вам необходимо войти в систему.

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

Вот что я пишу в .htaccess:

RewriteEngine on 
RewriteRule .documentation.php 

И вот мой список файлов сценария:

if ($handle = opendir('manual')) { 
    while (false !== ($entry = readdir($handle))) { 
    if ($entry != "." && $entry != "..") { 
     if (!preg_match('/.php/', $entry) && !preg_match('/.htaccess/', $entry)) //prevent some file to be shown 
      {echo "<a href='manual/$entry' target='_blank'>$entry</a><hr>";} 
     } 
    } 
    closedir($handle); 
} 

Любая идея, как получить доступ к файлам?

+0

И распечатка php работает, если вы отбрасываете htaccess? Я так не думаю. – sepehr

+0

Да. Почему ты так думаешь? –

+0

Поскольку 'opendir' открывает каталог, даже если веб-сервер выдает 500 внутренних ошибок. Вы проверили журналы ошибок? – sepehr

ответ

2

Как правило, не рекомендуется обслуживать защищенные файлы из корня документа. Специально, когда пользователям необходимо войти в систему, чтобы просмотреть/получить к ним доступ. Когда вы делегируете обслуживание веб-серверу, вы теряете способность программно проверять, зарегистрирован ли пользователь, поскольку веб-сервер Apache не знает, проверяется ли пользователь в вашем приложении PHP. Как только пользователь узнает о URL-адресе файла, она может получить доступ к файлу без входа в систему.

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

Однако, если вы настаиваете на том, чтобы идти этим путем, существует обходное решение. Давайте выложить пример структуру каталогов:

/path/to/web/document/root 
├── manual 
│   └── .htaccess 
│   └── file1.pdf # protected 
│   └── file2.pdf # protected 
│   └── file3.epub # protected 
├── documentation.php 
├── listing.php # protected 
└── .htaccess 

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

RewriteEngine on 
RewriteRule^/documentation.php [R] 
# Your own rewrite rule has a syntax error and 
# causes a 500 internal error 

Это перенаправлять все запросы к documentation.php файла в родительском каталоге. Снимите флаг R, если вам не нужна внешняя перенаправление.

Как вы уже сказали, проблема в том, что любой запрос к файлам внутри manual/ перенаправляется в файл документации.

Обходным путем является проверка заголовка HTTP_REFERER и убедитесь, что запрос поступает из файла listing.php.

RewriteEngine on 

# Feel free to change example.com with your own domain  
RewriteCond %{HTTP_REFERER} !^http://www.example.com/listing.php$ 
RewriteRule^/documentation.php [R] 

Таким образом, любой прямой запрос manual/file2.pdf приведет к перенаправлению documentation.php, но если пользователь нажимает на ссылку в listing.php она может получить доступ к файлу без каких-либо проблем.

Если вам нужно сделать условие реферер более общий характер, обратитесь к этой статье:
Referrer Checking with .htaccess

быть предупрежден that a user can easily spoof the HTTP_REFERER header и, таким образом, доступ к файлам без необходимости быть авторизованы. Единственный реальный пуленепробиваемый способ реализации этого - это то, что я сказал в начале этого сообщения.

Возможно, вы также захотите защитить каталог manual/, используя базовый http auth. Но таким образом пользователям необходимо ввести другую комбинацию имени пользователя и пароля для доступа к этой папке.

+0

, то как я могу получить доступ к файлам, если разместить их вне корня? –

+1

PHP может обращаться к файлам за пределами вашего корня документа. См. [Как обслуживать большие файлы через PHP] (http://teddy.fr/2007/11/28/how-serve-big-files-through-php/), чтобы получить эту идею. У вас также есть другие способы решения: [Лучшая стратегия защиты загружаемых файлов -php/mysql Apache2 server] (https://stackoverflow.com/a/5377241/65732) и [Обслуживание больших защищенных файлов в PHP/Apache] (https : //stackoverflow.com/a/3232547/65732). – sepehr

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