Я хочу убедиться, что люди не могут ввести имя скрипта PHP в URL-адрес и запустить его. Каков наилучший способ сделать это?
Я могу установить переменную в файле, который будет включать этот файл, а затем проверить эту переменную в включенном файле, но есть ли более простой способ?
Вы можете проверить URI и посмотреть, вызван ли этот файл с помощью `
$_SERVER['SCRIPT_FILENAME']
или вы можете переместить файл за пределы общей папки, это лучшее решение.
В нескольких приложениях с открытым исходным кодом, которые я использовал, включая Joomla и PHPBB, они объявляют константу в основном файле include, а затем проверяют, что константа существует в каждом из включений:
// index.php require_once 'includes.php'; // includes.php define('IN_MY_PROJECT', true); include 'myInc.php'; // myInc.php defined('IN_MY_PROJECT') || die("No direct access, plsktnxbai");
Я долго сохранял все, кроме скриптов, видимых непосредственно за пределами веб-корня. Затем настройте PHP, чтобы включить каталог сценария в путь. Типичная настройка:
AppDir включают HTML
В PHP-конфигурации (либо глобальной конфигурации PHP, либо в файле .htaccess
в каталоге html
) добавьте следующее:
include_path = ".: / path / to / appdir / include: / usr / share / php"
или (для Windows)
include_path = ".; c: \ path \ to \ appdir \ include; c: \ php \ includes"
Обратите внимание, что эта строка, вероятно, уже находится в вашем файле php.ini
, но может быть прокомментирована, что позволяет работать по умолчанию. Это может также включать другие пути. Обязательно сохраните их.
Если вы добавляете его в файл .htaccess, формат:
php_value include_path.: / path / to / appdir / include: / usr / share / php
Наконец, вы можете добавить путь программно с чем-то вроде этого:
$parentPath = dirname(dirname(__FILE__)); $ourPath = $parentPath . DIRECTORY_SEPARATOR . 'include'; $includePath = ini_get('include_path'); $includePaths = explode(PATH_SEPARATOR, $includePath); // Put our path between 'current directory' and rest of search path if ($includePaths[0] == '.') { array_shift($includePaths); } array_unshift($includePaths, '.', $ourPath); $includePath = implode(PATH_SEPARATOR, $includePaths); ini_set('include_path', $includePath);
(Исходя из рабочего кода, но измененного, так непроверенного)
Это должно быть запущено в вашем файле frontend (например, index.php
). Я помещаю его в отдельный файл include, который после изменения выше может быть включен с чем-то вроде #include '../includes/prepPath.inc'
.
Я использовал все версии, представленные здесь с успехом. Используемый конкретный метод зависит от предпочтений и способа развертывания проекта. Другими словами, если вы не можете изменить php.ini
, вы, очевидно, не сможете использовать этот метод
Zend Framework рекомендует хранить файлы вне корневого веб-узла, как предположил Unkwntech. Я бы сказал, что это самое безопасное и надежное решение.
Из модуля PHP Nuke:
<?php if (!eregi("modules.php", $PHP_SELF)) { die ("You can't access this file directly..."); } // more code ... ?>
Замените modules.php на ваше имя файла, и этот файл нельзя вызвать напрямую.
Один из способов, который я видел много, – создать переменную, которая должна присутствовать в каждом включенном файле, и проверить, что в первую очередь включается:
if(!isset($in_prog)){ exit; }
Я думаю, что лучший способ – разместить файлы, которые вы хотите включить в папку « / include », и установить право доступа 700 в папку