ФорумПрограммированиеPHP для идиотов → Доступ к файлам. Apache + cookie

Доступ к файлам. Apache + cookie

  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 1:34 п.п.

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

    Задачка:
    Требуется отдавать файлы с сайта с учетом прав одтельных пользователей.
    Условия:
    Shared-хостинг на Apache с доступным mod_rewrite и PHP.

    Очень распостранен такой метод: вместо "прямой" ссылки дается что-то вроде dowload.php?id=7367, а скрипт download.php проверяет права и, если они есть, формирует http-заголовки и отдает файл целиком через readfile() либо частями через echo fread. Метод хорош, но смущает
    1) Необходимость самому отрабатывать возможность докачки;
    2) На больших файлах скрипт может работать долго, а не факт, что set_time_limit() не закрыт администрацией;
    3) Не могу доказать, но сдается мне, что нагрузка на сервер будет выше, чем если бы файл отдавал непосредственно Apache. Повторю - мы на shared-хостинге. Это может оказаться критичным!
    Кроме того, испытываю болезненную страсть к прямым ссылкам или выглядящим как "прямые".

    Поэтому я предлагаю обсудить ДРУГОЙ метод. Статический файл отдается апачем, но апач должен как-то ограничивать доступ.

    Пусть наши тестовые скрипты находятся по адресу http: //test1.ru/fs1/

    Шаг 1. Обманка с адресом.
    Пусть наши файлы лежат в папке files. Имена файлов не совпадают с именами как они будут выглядеть в адресной строке и сохраняться на диск пользователя.
    Не буду вдаваться в подробности почему не хочу хранить файл с первозданным именем. Так надо!

    /fs1/.htaccess

    RewriteEngine on
    RewriteBase /

    RewriteRule download/([0-9a-f]+)/([^\.]+)\.([0-9a-z]+) /fs1/files/$1.$3 [L]


    Ссылка вида
    http: //test1.ru/fs1/download/c7d2/siski-super.gif
    будет приводиться к файлу
    <DocumentRoot>/fs1/files/c7d2.gif

    Чтобы хитрый пользователь не подсмотрел имена реальных файлов, создадим еще один .htaccess
    /fs1/files/.htaccess

    Options -Indexes



    Шаг 2. Наличие авторизации (точнее наличие нужной куки)
    Файлы спрятали, теперь надо контролировать доступ для отдельных пользователей.
    Ничего революционного. Авторизация пользователей производится на базе куков.
    Пусть наш сайт хранит пользовательскую запись в куке с именем login в виде пары
    username-password_hash
    Здесь неважно каким именно образом формируется этот hash. Мы будем читать куку, брать нужный кусок текста и использовать его.

    вторая версия /fs1/.htaccess

    RewriteEngine on
    RewriteBase /

    RewriteRule download/([0-9a-f]+)/([^\.]+)\.([0-9a-z]+) /fs1/files/$1.$3 [L]

    RewriteCond %{HTTP_COOKIE} !login=.*
    RewriteRule files/.* - [F,L]

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

    Шаг 3. Только правильный пользователь имеет доступ
    третья версия /fs1/.htaccess

    RewriteEngine on
    RewriteBase /

    RewriteRule download/([0-9a-f]+)/([^\.]+)\.([0-9a-z]+) /fs1/files/$1.$3 [L]

    RewriteCond %{HTTP_COOKIE} !login=.*
    RewriteRule files/.* - [F,L]

    RewriteCond %{HTTP_COOKIE} login=([a-zA-Z0-9]+)-([a-zA-Z0-9]{4})
    RewriteCond /home/test1.ru/www/fs1/access/$1-%2 !-f
    RewriteRule files/([0-9a-f]+).([0-9a-z]+) - [F,L]

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

    Предположим авторизованный пользователь имеет такую запись в куках
    john-1e37072609894a67cf903501c3a22d87
    и кем-то создан файл access/0fda-1e37
    тогда john сможет скачать файл по ссылке
    http: //test1.ru/fs1/download/0fda/sometext.txt

    Конечно папку access тоже надо закрыть от посторонних глаз!
    /fs1/access/.htaccess

    Options -Indexes

    Order allow,deny
    Deny from all

    Чтобы не раздувать пост, я ПОКА не привожу текста скриптов, отвечающих за авторизацию и за создание проверочных файлов-маркеров. Надеюсь суть метода уже понятна. Ели нет - спрашивайте.

    Прошу приступать к линчеванию.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 1:37 п.п., спустя 2 минуты 57 секунд

    задачу понял. в пизду апач. :)

    http://www.opennet.ru/base/net/nginx_x_accel_redirect.txt.html
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 1:40 п.п., спустя 3 минуты 2 секунды

    phpdude, даже не пойду по твоей ссылке. я специально для тебя сразу написал вводный текст:
    Условия:
    Shared-хостинг на Apache с доступным mod_rewrite и PHP.

    КАК вебмастер на низкобюджетном или бесплатном хостинге будет настраивать nginx???
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 1:43 п.п., спустя 3 минуты 5 секунд


    phpdude, даже не пойду по твоей ссылке. я специально для тебя сразу написал вводный текст:
    Условия:
    Shared-хостинг на Apache с доступным mod_rewrite и PHP.

    КАК вебмастер на низкобюджетном или бесплатном хостинге будет настраивать nginx???
    ах …. ))))) ну тогда попробуй это ))

    создавать ссылки на файлы с уникальными ключами типа [a-z0-9]{32,64}

    типа /det/jhsdkhyay12kjdoasidj11jiij1o2je1oj12ij3io12j3i123.jpg

    ln -s file.jpg ../get/jhsdkhyay12kjdoasidj11jiij1o2je1oj12ij3io12j3i123.jpg

    потом location: ../get/jhsdkhyay12kjdoasidj11jiij1o2je1oj12ij3io12j3i123.jpg

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

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 1:44 п.п., спустя 1 минуту 4 секунды

    а доступ к файлу ограничивай через htacceess в придачу если ты параноидален)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 1:48 п.п., спустя 4 минуты 5 секунд


    а доступ к файлу ограничивай через htacceess в придачу если ты параноидален)

    параноя - нормальное состояние админа.
    кстати хорошее предложение, в htaccess понадобится +FollowSymLinks или как там его… надо будет потестировать
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 1:51 п.п., спустя 2 минуты 38 секунд



    а доступ к файлу ограничивай через htacceess в придачу если ты параноидален)

    параноя - нормальное состояние админа.
    кстати хорошее предложение, в htaccess понадобится +FollowSymLinks или как там его… надо будет потестировать

    да это шорошее предложение))

    просто ссылку подлиннее генери, символов в 200 - тогда хуй кто че скачает)))))))

    ну и в нтаккесс складывай deny from all <file …>allow from ip.adddress.here</file> или тп, можно рврайт рулы класть, но это как я уже сказал для параноиков) ибо в 20 символов - хер угадаешь)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 4:20 п.п., спустя 2 часа 28 минут 58 секунд

    ok. генерация временных и очень длинных симлинков - еще один способ упрятывания файлов. чертовски хороший способ, но другой.
    тут есть свои "если", применительно к shared-хостингу.

    прошу вернуться к теме "Доступ к файлам. Apache + cookie".
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 6, 2008, 7:18 п.п., спустя 2 часа 58 минут 38 секунд


    ok. генерация временных и очень длинных симлинков - еще один способ упрятывания файлов. чертовски хороший способ, но другой.
    тут есть свои "если", применительно к shared-хостингу.

    прошу вернуться к теме "Доступ к файлам. Apache + cookie".
    просто на интерес, можно услышать эти если? а то непонятно сразу
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Дек. 7, 2008, 7:09 д.п., спустя 11 часов 50 минут 24 секунды

    Далеко ходить не надо:
    http://ru2.php.net/manual/ru/function.symlink.php

    This function sometimes just fails to work for no appearent reason, returning FALSE and not creating a symlink. Doing the same with exec('ln -s source dest') works perfectly. I recommend using the latter.

    На шаред-хостинге (!!!) альтернатива в виде exec(…) скорее всего будет недоступна

    Для Windows-платформ эта функция не реализована.

    Для тебя это не аргумент, но большинство начинающих веб-программеров используют в качестве тестовой платформы Denwer или иную среду под Windows. А деструктивные эксперименты сразу на шаред-хостинге (!!!) обычно заканчиваются отключением услуг.

    IMHO, этого достаточно чтобы заинтересоваться еще какими-нибудь способами.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 7, 2008, 7:54 д.п., спустя 45 минут 37 секунд

    `` - у меня на шареде не отключено.

    а насчет виндус … я вообще его не использую никогда, больше чем написать хело ворлд)))

    а по теме. я бы складывал в папки remote_addr-$cookiepart/file.txt вот тогда точно хуй кто файлы левый возьмет)))))))))))))) а метод предложенный с виду как неплохой. всяко лучше readfile.
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5147 Репутация: N Группа: в ухо

    Spritz Дек. 7, 2008, 10:42 д.п., спустя 2 часа 47 минут 26 секунд

    я когда-то гнездился на peterhost, там было недоступно почти все. а когда начинал что-то делать с выходом за timelimit 15сек (невозможно было увеличить), то провайдер меня отключал к ебеням и неделю приходилось вести переписку. типа "глубокоуважаемый господин, можно я для своей галереи один разик проведу конвртацию в другую систему. это потребует минуты две. пожалуста дяденька провайдер! я больше никогда не буду"

    сейчас пользуюсь более адекватными хостингами, а осадочек остался.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 7, 2008, 11:23 д.п., спустя 41 минуту 25 секунд


    я когда-то гнездился на peterhost, там было недоступно почти все. а когда начинал что-то делать с выходом за timelimit 15сек (невозможно было увеличить), то провайдер меня отключал к ебеням и неделю приходилось вести переписку. типа "глубокоуважаемый господин, можно я для своей галереи один разик проведу конвртацию в другую систему. это потребует минуты две. пожалуста дяденька провайдер! я больше никогда не буду"

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

    http://phpdude.ru/archives/385

    не совсем в тему, но про подобных пидоиров.
    а по ипу доступ это плюс в защиту :)
    Сапожник без сапог
  • Trej Gun

    Сообщения: 5305 Репутация: N Группа: в ухо

    Spritz Дек. 7, 2008, 1:28 п.п., спустя 2 часа 4 минуты 35 секунд

    полностью согласен с первыми двумя постами пхпдуда, второй способ с ln даже лучше чем я придумал я думал методом пхп делать copy() потому что system на shared хосте может быть закрыт
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz Дек. 7, 2008, 1:33 п.п., спустя 5 минут 26 секунд


    полностью согласен с первыми двумя постами пхпдуда, второй способ с ln даже лучше чем я придумал я думал методом пхп делать copy() потому что system на shared хосте может быть закрыт
    неее копи в пезду)) ссылки достаточно. можно еще и не ссылки!!о кстати смотрите! можно не ссылки, А rewriterule ;) мод рерайт то наверное доступен на шареде :) + можно использовать http://httpd.apache.org/docs/2.2/mod/mod_rewrite.html#rewritemap но это на шареде скорее всего закрыто (

    а вот просто в хтаккесс писать правила на скачку = раз посрать :)
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!