Как запретить доступ к файлам на прямую drupal6

Главные вкладки

Аватар пользователя Tynai Tynai 18 октября 2013 в 22:13

Добрый день!
Подскажите пожалуйста, как ограничить доступ к файлам вида: http://test.ru/sites/default/files/pdf/test.pdf при обращении через адресную строку. Но разрешить доступ к этим же файлам, при обращении к ним через src в iframe.
В моем случае используется модуль PDF для отображения на сайте. Но если папке поставить ограничения на выполнение для всех через атрибуты chmod, то файл и в iframe - не отображается.
Подскажите пожалуйста, что можно сделать. Версия Drupal 6.
Кстати в разрешениях просмотр содержимого поля стоит только для авторизованного пользователя, но это ограничение не помогает.

Комментарии

Аватар пользователя sg85 sg85 18 октября 2013 в 23:03

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

Аватар пользователя Tynai Tynai 20 октября 2013 в 21:42

sg85 wrote:
настраиваем сервер так, чтоб при обращении к этим файлам он отправлялся к друпалу, в друпе создаем колбек для меню с этим адресом через который и отдаем файлы предварительно проводя проверки доступа.

подскажите пожалуйста как настроить сервер, можно в файле .htaccess? Но что надо прописать?

Аватар пользователя Tynai Tynai 20 октября 2013 в 10:28

sg85, спасибо!
Подскажите пожалуйста, как надо настроить сервер?
Еще предложили решение, чтобы в iframe прописывать путь до php файла, в котором будет проверка на доступ к файлу и потом его уже инклудить.

Аватар пользователя sg85 sg85 20 октября 2013 в 23:02

"Tynai" wrote:
Еще предложили решение, чтобы в iframe прописывать путь до php файла, в котором будет проверка на доступ к файлу и потом его уже инклудить.

через php файл можно, но я бы так делать не стал.

"Tynai" wrote:
подскажите пожалуйста как настроить сервер, можно в файле .htaccess? Но что надо прописать?

через .htaccess можно, один из наиболее удобных вариантов создать реврайт правило на php файл(если уж решили им) или просто на путь объявленный в Вашем модуле. К сожалению апач не помню, так что сами правила подсказать не смогу, в документацию лезть лень.

Аватар пользователя Tynai Tynai 20 октября 2013 в 23:32

sg85 wrote:
"Tynai" wrote:
Еще предложили решение, чтобы в iframe прописывать путь до php файла, в котором будет проверка на доступ к файлу и потом его уже инклудить.

через php файл можно, но я бы так делать не стал.

"Tynai" wrote:
подскажите пожалуйста как настроить сервер, можно в файле .htaccess? Но что надо прописать?

через .htaccess можно, один из наиболее удобных вариантов создать реврайт правило на php файл(если уж решили им) или просто на путь объявленный в Вашем модуле. К сожалению апач не помню, так что сами правила подсказать не смогу, в документацию лезть лень.

пишу правило для .htaccess:
RewriteEngine On
RewriteRule .(pdf)$ /sites/all/modules/pdf/pdf.module
Я наверное не правильно указываю путь до модуля? как правильно настроить чтобы правило друпала, прописанное в функции hook_menu срабатывало?

Аватар пользователя sg85 sg85 20 октября 2013 в 23:38

Причем тут модуль? допустим, у Вас картинки как положено складываются в "sites/default/files/some_images/*", при этом в модуле задаете адрес, например, "mymodule/%", необходимо чтобы при обращении к sites/default/files/some_images/* редирект шел в mymodule/*. Подобный подход не должен возыметь каких либо неприятных последствий.

Аватар пользователя Tynai Tynai 21 октября 2013 в 0:06

function pdf_menu() {
$items = array();
$items['pdf_access'] = array(
'page callback' => 'pdf_access_view',
'access callback' => TRUE,
'access arguments' => array('pdf_access_view'),
'type' => MENU_CALLBACK
);
return $items;
}
function pdf_access_view() {
$fil=$_SESSION['file_url'];
return($fil);

}
????

Аватар пользователя Tynai Tynai 21 октября 2013 в 0:13

sg85 wrote:
Причем тут модуль? допустим, у Вас картинки как положено складываются в "sites/default/files/some_images/*", при этом в модуле задаете адрес, например, "mymodule/%", необходимо чтобы при обращении к sites/default/files/some_images/* редирект шел в mymodule/*. Подобный подход не должен возыметь каких либо неприятных последствий.

А не будет зацикленности? посмотрите пожалуйста правильность вызова и return.

Аватар пользователя sg85 sg85 21 октября 2013 в 0:21

Для 7рки как-то так:

function some_callback($filename){
  //$filename - это аргумент из адресной строки, в данном случае передается как аргумент из hook_menu
  //$filepath - как не сложно догадаться, содержит в себе полный путь к реальному файлу
  $filepath = drupal_realpath('public://some_images/').$filename;
  if(!file_exists($filepath)) return MENU_NOT_FOUND;

  drupal_add_http_header('Content-Type', 'image/jpeg');

  $fp = fopen($filepath, 'rb');
  while (!feof($fp)) {
    print fread($fp, 1024);
  }
  fclose($fp);

  drupal_exit();
}

Самое главное, на что следует обратить внимание, это то, что проверка доступа будет проводиться в hook_menu.

А вот под 6рку не писал уже довольно давно, но принцип остается тем же.(и да, 6рка не понимает public://, к сожалению не помню, каким образом получить в 6рке путь к sites/default/files). Если 6рка не умеет в hook_menu передавать аргументы в колбек(не помню этот момент), то для получения аргумента можно воспользоваться функцией arg().

И да, выдача картинок через PHP довольно тяжелый процесс для сервера(о чем собственно предупреждает 7рка, которая эту хрень уже некоторым образом поддерживает)

Аватар пользователя sg85 sg85 21 октября 2013 в 0:26

тогда уж

function pdf_menu(){
  return array(
    'pdfaccess/%' => array(
      'type' => MENU_CALLBACK,
      'page callback' => 'some_callback',
      'page arguments' => array(1),
      'access arguments' => array('pdf_access_view'),
      'access callback' => 'user_access',//в 6рке не устанавливается по умолчанию? не помню. в 7рке эта строчка не нужна
    ),
  );
}