Какой лучший способ разрешить включение только файла PHP? - PullRequest
11 голосов
/ 06 октября 2008

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

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

Ответы [ 7 ]

11 голосов
/ 06 октября 2008

В некоторых приложениях с открытым исходным кодом, в которых я работал, включая Joomla и PHPBB, они объявляют константу в основном файле включений, а затем проверяют, существует ли константа в каждом из включений:

// 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");
7 голосов
/ 06 октября 2008

Вы можете проверить URI и посмотреть, вызывается ли этот файл с помощью `

$_SERVER['SCRIPT_FILENAME']

или вы можете переместить файл за пределы общей папки, это лучшее решение.

4 голосов
/ 06 октября 2008

Я долго хранил все, кроме скриптов, доступных для непосредственного просмотра, вне корневого веб-каталога. Затем настройте PHP для включения вашего каталога скриптов в путь. Типичная установка будет:

appdir
  include
  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);

(основано на рабочем коде, но изменено, поэтому не проверено)

Это должно быть запущено в вашем файле внешнего интерфейса (например, index.php). Я поместил его в отдельный включаемый файл, который после модификации выше можно включить с чем-то вроде #include '../includes/prepPath.inc'.

Я успешно использовал все представленные здесь версии. Конкретный метод зависит от предпочтений и способа развертывания проекта. Другими словами, если вы не можете изменить php.ini, вы, очевидно, не сможете использовать этот метод

0 голосов
/ 07 января 2017

Полагаю, лучший способ - поместить файлы, которые вы хотите включить, в папку " / include " и поместить право доступа 700 в папку

0 голосов
/ 06 октября 2008

Один из способов, которые я видел, состоит в том, чтобы создать переменную, которая должна присутствовать в каждом включенном файле, и сначала проверить, что входит в каждый файл:

if(!isset($in_prog)){
exit;
}
0 голосов
/ 06 октября 2008

Из модуля PHP Nuke:

<?php
if (!eregi("modules.php", $PHP_SELF)) {
   die ("You can't access this file directly...");
}
// more code ...
?>

Замените modules.php именем вашего файла, и этот файл не может быть вызван напрямую.

0 голосов
/ 06 октября 2008

Zend Framework рекомендует хранить файлы вне корневого веб-каталога, как предлагает Unkwntech. Я бы сказал, что это самое безопасное и надежное решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...