У меня есть php-файл, который я буду использовать исключительно для включения. Поэтому я хотел бы выдать ошибку вместо того, чтобы выполнить ее, когда к ней обращаются напрямую, введя URL вместо того, чтобы быть включенным.
В основном мне нужно сделать проверку следующим образом в файле php:
if ( $REQUEST_URL == $URL_OF_CURRENT_PAGE ) die ("Direct access not premitted");
Есть простой способ сделать это?
php
include
include-guards
Alterlife
источник
источник
Ответы:
Самый простой способ для общей ситуации «приложение PHP, работающее на сервере Apache, которым вы можете или не можете полностью управлять», - это поместить ваши включения в каталог и запретить доступ к этому каталогу в вашем файле .htaccess. Чтобы избавить людей от проблем с Google, если вы используете Apache, поместите его в файл с именем «.htaccess» в каталоге, который вам не нужен:
Если вы на самом деле имеете полный контроль над сервером (в наши дни это более распространено даже для небольших приложений, чем когда я впервые писал этот ответ), лучший способ - разместить файлы, которые вы хотите защитить, за пределами каталога, из которого обслуживается ваш веб-сервер. , Поэтому, если ваше приложение включено
/srv/YourApp/
, настройте сервер для обслуживания файлов/srv/YourApp/app/
и вставьте включенные файлы/srv/YourApp/includes
, чтобы буквально не было URL-адресов, которые могли бы получить к ним доступ.источник
<Files ~ "\.inc$">
Order Allow,Deny
Deny from All
</Files>
Добавьте это на страницу, которую хотите включить только
затем на страницах, которые включают его добавить
источник
somefile.php
на вашем сервере и добавили в него ваше определение, это все равно не дает им прямой доступ к файлу включения. Это позволит им «включать» файлы вашей библиотеки, но если они зайдут достаточно далеко, чтобы создавать файлы на вашем сервере и знать ваши сценарии define / include, у вас возникнут другие проблемы, которые, скорее всего, не позволят написать собственный файл с вашим определением. ,У меня есть файл, который мне нужно действовать по-разному, когда он включен по сравнению с, когда к нему обращаются напрямую (в основном,
print()
противreturn()
) Вот некоторый модифицированный код:Доступ к файлу всегда является включенным файлом, поэтому == 1.
источник
Лучший способ предотвратить прямой доступ к файлам - разместить их вне корня документа веб-сервера (обычно на один уровень выше). Вы по-прежнему можете включать их, но нет возможности доступа к ним через HTTP-запрос.
Я обычно иду до конца и помещаю все свои PHP-файлы вне корневого каталога документа, кроме файла начальной загрузки - одиночного index.php в корневом каталоге документа, который начинает маршрутизацию всего сайта / приложения.
источник
1: Проверка количества включенных файлов
Логика: PHP завершается, если минимальное число включений не выполнено. Обратите внимание, что до PHP5 базовая страница не считается включаемой.
2: определение и проверка глобальной константы
Логика: если константа не определена, то выполнение не начнется с базовой страницы, и PHP прекратит выполнение.
Обратите внимание, что ради переносимости между обновлениями и будущими изменениями использование этого метода аутентификации модульным значительно уменьшит накладные расходы при кодировании, поскольку изменения не нужно будет жестко кодировать для каждого отдельного файла.
Таким образом, дополнительный код может быть добавлен
checkdefined.php
для регистрации и аналитических целей, а также для генерации соответствующих ответов.Кредит, где кредит должен: блестящая идея переносимости пришла из этого ответа .
3: Удаленная авторизация адреса
Недостатком этого метода является изолированное выполнение, если только токен сеанса не предоставлен с внутренним запросом. Проверьте через адрес обратной связи в случае конфигурации с одним сервером или белый список адресов для многосерверной или серверной инфраструктуры с балансировкой нагрузки.
4: авторизация токена
Как и в предыдущем методе, можно использовать GET или POST для передачи токена авторизации во включаемый файл:
Очень грязный метод, но, возможно, самый безопасный и универсальный одновременно, при правильном использовании.
5: Конфигурация веб-сервера
Большинство серверов позволяют вам назначать разрешения для отдельных файлов или каталогов. Вы можете поместить все свои включения в такие ограниченные каталоги и настроить сервер на их запрет.
Например, в APACHE конфигурация хранится в
.htaccess
файле. Учебник здесь .Однако обратите внимание, что специфичные для сервера конфигурации не рекомендуются мной, поскольку они плохо переносятся между различными веб-серверами. В таких случаях, как системы управления контентом, где алгоритм deny сложен или список запрещенных каталогов довольно велик, это может сделать сеансы реконфигурации довольно ужасными. В конце концов, лучше всего справиться с этим в коде.
6: Размещение включает в безопасном каталоге за пределами корня сайта
Наименее предпочтительный из-за ограничений доступа в серверных средах, но довольно мощный метод, если у вас есть доступ к файловой системе.
Логика:
htdocs
папки, поскольку ссылки будут выходить за рамки адресной системы сайта.Пожалуйста, извините мои неортодоксальные соглашения о кодировании. Любые отзывы приветствуются.
источник
Альтернативой (или дополнением) решению Чака было бы запретить доступ к файлам, соответствующим определенному шаблону, добавив что-то подобное в ваш файл .htaccess.
источник
На самом деле мой совет - использовать все эти лучшие практики.
Таким образом, если файлы становятся неуместными (ошибочная операция ftp), они все еще защищены.
источник
Однажды у меня была эта проблема, решенная с помощью:
но идеальным решением является размещение файла вне корневого каталога документов веб-сервера, как упоминалось в другом ответе.
источник
Вам лучше создать приложение с одной точкой входа, т.е. все файлы должны быть доступны из index.php
Поместите это в index.php
Эта проверка должна выполняться в каждом связанном файле (через require или include)
источник
Я хотел ограничить доступ к файлу PHP напрямую, но также иметь возможность вызывать его через
jQuery $.ajax (XMLHttpRequest)
. Вот что сработало для меня.источник
Самый простой способ - установить переменную в файле, который вызывает include, например:
Затем в файле, который включен, проверьте переменную
источник
Помимо способа .htaccess, я видел полезный шаблон в различных фреймворках, например в ruby на рельсах. У них есть отдельный каталог pub / в корневом каталоге приложения, а каталоги библиотеки живут в каталогах на же уровня, что и pub /. Примерно так (не идеально, но вы поняли):
Вы настроили свой веб-сервер на использование pub / в качестве корня документа. Это обеспечивает лучшую защиту ваших сценариев: хотя они могут обращаться к корневому каталогу документа для загрузки необходимых компонентов, доступ к компонентам из Интернета невозможен. Другое преимущество, помимо безопасности, заключается в том, что все в одном месте.
Эта настройка лучше, чем просто создание проверок в каждом включенном файле, потому что сообщение «доступ запрещен» является подсказкой для злоумышленников, и это лучше, чем конфигурация .htaccess, потому что она не основана на белом списке: если вы испортили расширения файла он не будет виден в каталогах lib /, conf / etc.
источник
Какая Joomla! do определяет Константу в корневом файле и проверяет, определена ли она во включаемых файлах.
или еще
Можно хранить все файлы вне досягаемости http-запроса, размещая их вне каталога webroot, как рекомендует большинство фреймворков, таких как CodeIgniter.
или даже поместив файл .htaccess в папку include и правила записи, вы можете запретить прямой доступ.
источник
источник
Мой ответ несколько отличается в подходе, но включает в себя многие ответы, представленные здесь. Я бы порекомендовал многоплановый подход:
defined('_SOMECONSTANT') or die('Hackers! Be gone!');
ОДНАКО
defined or die
подход имеет ряд недостатков. Во-первых, это реальная боль в допущениях для тестирования и отладки. Во-вторых, если вы передумаете, это будет ужасающе, ошеломляюще скучным рефакторингом. "Найти и заменить!" ты говоришь. Да, но насколько вы уверены, что везде написано одно и то же, хммм? Теперь умножьте это на тысячи файлов ... oOИ тогда есть .htaccess. Что произойдет, если ваш код распространяется на сайты, где администратор не так скрупулезен? Если вы полагаетесь только на .htaccess для защиты своих файлов, вам также понадобятся: а) резервная копия, б) коробка с салфетками, чтобы высушить ваши слезы, в) огнетушитель для тушения пламени во всей ненависти от людей используя ваш код
Итак, я знаю, что вопрос требует «самого простого», но я думаю, что это требует более «защитного кодирования».
Я предлагаю следующее:
require('ifyoulieyougonnadie.php');
(а неinclude()
в качестве заменыdefined or die
)В
ifyoulieyougonnadie.php
, сделать некоторые логики вещей - проверку для различных констант, вызывая сценарий, локальное тестирование и такой - а затем реализовать вашиdie(), throw new Exception, 403
, и т.д.Я создаю свой собственный фреймворк с двумя возможными точками входа - основной index.php (фреймворк Joomla) и ajaxrouter.php (мой фреймворк) - поэтому в зависимости от точки входа я проверяю разные вещи. Если запрос
ifyoulieyougonnadie.php
не приходит из одного из этих двух файлов, я знаю, что махинации предпринимаются!Но что, если я добавлю новую точку входа? Не беспокойся. Я просто меняю
ifyoulieyougonnadie.php
и сортирую, плюс нет «найди и замени». Ура!Что если я решил переместить некоторые из моих сценариев для создания другой среды, которая не имеет одинаковых констант
defined()
? ... Ура! ^ _ ^Я обнаружил, что эта стратегия делает разработку намного веселее и намного меньше:
источник
Если точнее, вы должны использовать это условие:
get_included_files () возвращает индексированный массив, содержащий имена всех включенных файлов (если файл выполняется как beign, то он был включен, и его имя находится в массиве). Таким образом, когда файл доступен напрямую, его имя является первым в массиве, все остальные файлы в массиве были включены.
источник
Поместите код выше в верхней части вашего включенного файла PHP.
например:
источник
Следующий код используется в Flatnux CMS ( http://flatnux.altervista.org ):
источник
Я нашел это php-only и неизменное решение, которое работает как с http, так и с cli:
Определить функцию:
Вызовите функцию в файле, к которому вы хотите запретить прямой доступ:
Большинство из приведенных выше решений этого вопроса не работают в режиме Cli.
источник
источник
источник
Хранение ваших включаемых файлов вне каталога, доступного через Интернет, упоминалось несколько раз и, по возможности, является хорошей стратегией. Тем не менее, еще один вариант, который я еще не видел, был упомянут: убедитесь, что ваши включаемые файлы не содержат исполняемый код . Если ваши включаемые файлы просто определяют функции и классы и не имеют никакого другого кода, они просто создадут пустую страницу при прямом доступе.
Разумеется, разрешите прямой доступ к этому файлу из браузера: он ничего не сделает . Он определяет некоторые функции, но ни одна из них не вызывается, поэтому ни одна из них не запускается.
То же самое относится и к файлам, которые содержат только классы PHP и ничего больше.
По-прежнему рекомендуется хранить файлы вне веб-каталога, где это возможно.
system
, потому что это будет конфликтовать с путем, используемым для кода. Я нахожу это раздражающим.источник
Сделать что-то вроде:
источник
Вы можете использовать следующий метод ниже, хотя, у него есть недостаток, потому что он может быть подделан, за исключением случаев, когда вы можете добавить еще одну строку кода, чтобы убедиться, что запрос поступает только с вашего сервера либо с помощью Javascript. Вы можете поместить этот код в раздел «Тело» своего HTML-кода, чтобы там отображалась ошибка.
Поместите другой код HTML здесь
Завершите это так, чтобы вывод ошибки всегда отображался в разделе body, если вы хотите, чтобы это было так.
источник
Я предлагаю не использовать
$_SERVER
по соображениям безопасности.Вы можете использовать переменную, как
$root=true;
в первом файле, который включал другой.и использовать
isset($root)
в начале второго файла, который будет включен.источник
Что вы также можете сделать, это защитить каталог паролем и хранить там все свои php-скрипты, разумеется, кроме файла index.php, поскольку во время включения пароль не потребуется, поскольку он потребуется только для доступа по http. он также предоставит вам возможность доступа к вашим сценариям, если вы захотите, поскольку у вас будет пароль для доступа к этому каталогу. вам потребуется настроить файл .htaccess для каталога и файл .htpasswd для аутентификации пользователя.
ну, вы также можете использовать любое из предложенных выше решений, если вам кажется, что вам не нужен обычный доступ к этим файлам, потому что вы всегда можете получить к ним доступ через cPanel и т. д.
Надеюсь это поможет
источник
Самый простой способ - хранить ваши включения вне веб-каталога. Таким образом, сервер имеет доступ к ним, но не имеет внешнего компьютера. Единственным недостатком является необходимость иметь доступ к этой части вашего сервера. Плюс в том, что он не требует настройки, настройки или дополнительного кода / нагрузки на сервер.
источник
Я не нашел предложения с .htaccess настолько хорошими, потому что он может заблокировать другой контент в этой папке, к которому вы, возможно, захотите разрешить пользователю доступ, вот мое решение:
источник
сделает работу гладко
источник
BASEPATH
const
устанавливается вindex.php
файле, который лежит в нижней части древовидной структуры. CI переписывает URL-адреса, поэтому нет необходимости напрямую обращаться к сценариям.Добавлено упомянутое ранее решение с проверкой версии PHP:
источник