Каков наилучший способ включить только файл PHP?

Я хочу убедиться, что люди не могут ввести имя скрипта PHP в URL-адрес и запустить его. Каков наилучший способ сделать это?

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

Solutions Collecting From Web of "Каков наилучший способ включить только файл PHP?"

Вы можете проверить 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 в папку