Php закрыть доступ к файлу
У меня есть база данных SQL с кучей записей с некоторой нечувствительной информацией о клиентах. Первичный ключ на этом является целым числом автоинкремента, и у меня есть ряд PDF-файлов, которые соответствуют каждому из этих целых чисел (например, 555.формат PDF, 7891.PDF и т. д.).
моя цель-ограничить прямой доступ к этим файлам, я хочу, чтобы пользователи должны пройти через процесс поиска и входа в систему (PHP) в первую очередь. Первоначально я планировал поместить файлы выше папки PUBLIC_HTML, но GoDaddy отказывается предоставить мне корневой доступ без выделенного сервера ($20 в месяц от них).
следующее, что я посмотрел, был HTACCESS. Я собирался ограничить доступ к файлам только PHP-скриптами, разрешив доступ только к IP-адресу сервера (или localhost/127.0.0.1). К сожалению, это не работа, потому что GoDaddy не запускает Apache на своих серверах Windows.
Я мог бы поместить файлы в BLOBs в базе данных, но это становится очень грязным, когда мне нужно работать с ними быстро (плюс у меня были некоторые проблемы с этим подходом).
любые предложения по ограничению доступа к файлам только скриптом PHP (readfile ())?
поскольку вы не можете поместить файлы в любом месте, кроме каталога public_html, вам придется пойти на метод "безопасность по неизвестности"
создайте случайно названный подкаталог для хранения файлов в: public_html / RANDOMGARBAGE
убедитесь, что каталог не доступен для просмотра. Отключите просмотр каталогов (если можете) и поместите документ по умолчанию (index.HTML-код?) там также, Так что даже если просмотр включен, вы не получите список каталогов.
не храните файлы с угадываемыми именами. Вместо того, чтобы хранить их с идентификатором базы данных, храните их с соленым+хэшированным именем вместо: $crypted_filename = sha1($real_filename . 'some hard-to-guess salt text'); (конечно, сделать это более сложным, если вам нужно). Сохранить исходное имя файла в базе данных. Так что вы в конечном итоге с чем-то вроде:
подавать файлы через php-скрипт-никогда не ссылаться на хэшированное имя файла прямо
таким образом, пользователь никогда не увидит, что ваше имя файла "s00per seekrit", они просто увидят, что их браузер попал . php?fileID=37 и начать загрузку secret file.pdf
кроме того, вы можете иногда переименовывать специальный подкаталог в что-то еще на регулярной основе, а также изменять текст соли (который затем требует обновления всех хэшированных имен файлов с новым sha1 значения.)
поскольку PHP использует разрешения пользователя веб-сервера, невозможно ограничить доступ к файлам без:
- размещение их вне DOCROOT
- изменение конфигурации веб-сервера, чтобы запретить доступ к этим файлам
- изменение файла, чтобы он был интерпретирован веб-сервером, скрывая его содержимое
размещение их в базе данных считается за пределами DOCROOT. Для третьего варианта, вы могли бы сделать файлы PHP PDFs, но, честно говоря, это было бы довольно запутанно.
Я рекомендую вам связаться с GoDaddy и посмотреть, есть ли у них какой-то способ настроить права доступа к файлам в каталоге.
Вы можете просто скрыть их. Это безопасность через неизвестность, но это звучит как ваш лучший вариант, если вы не можете либо держать их вне веб-корня, либо найти способ сказать серверу не обслуживать их напрямую.
поэтому вставьте их в какой-то случайно названный каталог:
затем напишите себе небольшой PHP-скрипт, который отправит соответствующие заголовки и передаст содержимое файла.
теперь выше на самом деле не лучше, чем просто обслуживать файлы напрямую (пока), так как люди все еще могут увеличивать параметр id в строке запроса.
но вы должны быть в состоянии выяснить, как обрабатывать авторизацию довольно легко.
сделать веб-папку недоступной через chmod. PHP по-прежнему сможет включать/требовать все, что находится на сервере, но пользователи не смогут перейти к файлам когда-либо.
пример: Это установлено в 770, т. е. пользователь и группа могут читать/писать / выполнять, другие ничего не могут сделать.
У меня есть php-файл, который я буду использовать исключительно как включаемый. Поэтому я хотел бы выдать ошибку вместо его выполнения, когда к нему обращаются напрямую, набирая его URL. То есть мне нужно сделать следующую проверку в php-файле:
if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Прямой доступ к файлу запрещен");
Есть ли простой способ сделать это?
Ответ 1
Самый простой способ для стандартной ситуации « PHP-приложение работает на сервере Apache, который вы можете полностью или не полностью контролировать » – поместить ваши include в каталог и запретить доступ к этому каталогу в файле .htaccess. Чтобы избавить людей от необходимости гуглить, если вы используете Apache, поместите это в файл под названием ".htaccess" в директории, к которой вы не хотите иметь доступ:
Deny from all .
Если у вас действительно есть полный контроль над сервером (в наши дни это более распространено даже для небольших приложений), лучший подход – поместить файлы, которые вы хотите защитить, вне каталога, из которого обслуживается ваш веб-сервер. Так, если ваше приложение находится в /srv/YourApp/, установите сервер на обслуживание файлов из /srv/YourApp/app/ и поместите include в /srv/YourApp/includes, так чтобы не было никакого URL, который может получить к ним доступ.
Ответ 2
Добавьте это к странице, которую вы хотите, чтобы только она была включена:
<?php
if(!defined('MyConst'))
die('Прямой доступ запрещен');
>
?>
затем на страницах, включающих его, добавьте:
<?php
define('MyConst', TRUE);
?> .
Ответ 3
1. Проверка количества включенных файлов
if( count(get_included_files()) == ((version_compare(PHP_VERSION, '5.0.0', '>='))?1:0) )
exit('Ограниченный доступ');
>
Логика: PHP завершает работу, если не соблюдается минимальное количество включений. Обратите внимание, что до PHP5 базовая страница не считалась включаемой.
2: Определение и проверка глобальной константы
3: Авторизация удаленного адреса
// Вызовите include из базовой страницы (прямой доступ):
$includeData = file_get_contents("http://127.0.0.1/component.php?auth=token");
// В включаемых файлах (где прямой доступ запрещен):
$src = $_SERVER['REMOTE_ADDR']; // Получение исходного адреса
$auth = authoriseIP($src); // Алгоритм авторизации
if( !$auth ) exit('Ограниченный доступ');
Недостатком этого метода является изолированное выполнение, если только токен сеанса не предоставлен с внутренним запросом. Подтвердите с помощью обратного адреса в случае конфигурации с одним сервером или белого списка адресов для многосерверной или серверной инфраструктуры с балансировкой нагрузки.
4: Авторизация токена
Как и в предыдущем методе, можно использовать GET или POST для передачи токена авторизации в включаемый файл:
if($key!="serv97602")
Очень запутанный метод, но, возможно, в то же время самый безопасный и универсальный при правильном использовании.
5: Конфигурация конкретного веб-сервера
Большинство серверов позволяют назначать разрешения для отдельных файлов или каталогов. Вы можете поместить все свои включения в такие ограниченные каталоги и настроить сервер на их запрет.
Например, в APACHE конфигурация хранится в файле .htaccess .
Однако обратите внимание, что конфигурации для конкретных серверов я не рекомендую, потому что они плохо переносятся на разные веб-серверы. В таких случаях, как системы управления контентом, где алгоритм запрета является сложным или список запрещенных каталогов довольно велик, это может только сделать сеансы реконфигурации довольно запутанными.
6. Размещение включает в себя безопасный каталог ВНЕ корня сайта.
Пользователь не может запросить какой-либо файл за пределами папки htdocs , поскольку ссылки будут выходить за рамки адресной системы веб-сайта.
Сервер php обращается к файловой системе изначально и, следовательно, может получать доступ к файлам на компьютере так же, как это может делать обычная программа с необходимыми привилегиями.
Поместив включаемые файлы в этот каталог, вы можете гарантировать, что php-сервер получит к ним доступ, в то время как горячие ссылки запрещены для пользователя.
Даже если конфигурация доступа к файловой системе веб-сервера не была выполнена должным образом, этот метод предотвратит случайное открытие доступа к этим файлам.
Ответ 4
.htaccess и ограничения Apache
defined('_SOMECONSTANT') or die(' Хакеры! Уходите!');
Перед любым из ваших скриптов использовать require('ifyoulieyougonnadie.php'); ( не include() и в качестве замены defined or die )
В ifyoulieyougonnadie.php , сделайте некоторые логические вещи - проверьте различные константы, вызывающий скрипт, тестирование localhost и т. д. - а затем реализуйте свой die(), throw new Exception, 403 и т. д.
Ответ 5
Ответ 6
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Задача по разграничению доступа к файлам, которые хранятся на диске довольно редка, но она может возникнуть при написании: online-магазина, который торгует файлами или файлового сервера вроде rapidshare.de. В данной статье я рассмотрю 3-и способа разграничения доступа при помощи php, mysql и специальных модулей веб сервера apache.
Это самый простой на мой взгляд способ, он не требует установки каких-то дополнительных модулей apache, но в то же время, в чистом виде, это наименее гибкий метод и работать он будет только на сервере под управлением *nix. Темнеменее это метод прекрасно подойдет для файлового хостинга.
Что нужно сделать:
1. Создадим две директории, в одной из которых будут храниться все файлы, доступ к которым нужно ограничить, а вторая пока будет пуста. Для примере я создал у себя директории: members и free;
2. В директории members создадим файл .htaccess с одной директивой «deny from all», таким образом мы закрываем эту директорию и все файлы, которые вней находятся;
4. Теперь предположим что пользователь авторизовался на вашем сайте или выполнил любые другие действия, после которых он может получить доступ к закрытому файлу. Чтобы дать ему доступ все что нужно это создать символьную ссылку на это файл в директории, которая не закрыта при помощи .htaccess. В моем случае это будет выглядеть примерно так:
exec('cd free; ln -s ../members/test.html test.html');
таким образом в каталоге free у нас будет ссылка на файл из каталога members и мы сможет редиректить на него пользователя или выдать URL.
Так же можно и нужно примешать к названию символьной ссылки какой-нибудь хеш и время, до которого она будет активна. Для удаления просроченных ссылок довольно просто можно написать CLI скрипт и выполнять его по крону раз в N минут.
Что нужно сделать:
1. Создадим таблицу в нашей MySQL базе:
CREATE TABLE `users_sessions` (
`cookie_name` varchar(32) NOT NULL,
`cookie_value` varchar(32) NOT NULL,
`expire` int(11) default '0',
`ip` varchar(15) NOT NULL,
`login` varchar(32) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
где: cookie_name — имя cookie, cookie_value — значение cookie, expire — время окончания действия cookie в формате unix timestamp (в php текущее время в этом формате возвращается функцией time()), ip — удаленный IP, с которого зашел пользователь, login — логин текущего пользователя (нужен для создания личных файлов .htaccess).
3. После успешной авторизации пользователя на сайте сделаем следующие действия:
// Подготавливаем дату окончания действия cookie
$expire = time() + 60 * 60; // cookie будет действовать 1 час
// Подготавливаем значение для авторизационной cookie
$cookieValue = md5($userPassword . $userLogin . $expire . $_SERVER['REMOTE_ADDR']);
// Устанавливаем авторизационную cookie
setcookie('AuthorizationCookie', $cookieValue);
// Сохраняем значения cookie в базе
mysql_query('insert into users_sessions values ("AuthorizationCookie", "' . $cookieValue . '", ' . $expire . ', "' . $_SERVER['REMOTE_ADDR'] . '", "' . $userLogin . '")');
После этих действий мы можем редиректить пользователя на любой файл, находящийся в каталоге members.
Вот собственно и все. На данный момент это все известные мне способы разграничения прав доступа к файлам под управлением веб сервера apache. Если кто-то знает другие — поделитесь ссылкой и я с удовольствием о них почитаю.
Исходников нет, т.к. реализация очень простая:
Итак, как это делается. Далеко ходить не будем. Рассмотрим как реализовано в CMS Joomla. В файле index.php корневой директории в самом начале есть такая строчка:
А в файлах подключаемых компонетов, модулей и т.д. (тоже в самом начале) такая:
По аналогии также делаем и у себя. Вот код демо-страницы:
файл index.php
Инклюд-файл inc/response.php:
Все очень просто. В коде я привел имя константы и ее значение в том виде, как написано в файлах Joomla. Имя константы и ее значение могут быть любыми, так что желательно придумать свое. Помните только, что имена констант пишутся в верхнем регистре.
Вот и все. по остальным вопросам ответы тоже будут, но позже. Всему свое время :)
5 последних уроков рубрики "PHP"
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза "фильтруйте всё, экранируйте всё" всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Читайте также: