include () Почему я не должен его использовать? - PullRequest
5 голосов
/ 30 мая 2010

Я работаю с более старой книгой php mysql, написанной в 2003 году. Автор использует функцию include () для создания html-страниц, включая файлы header.inc, footer.inc, main.inc и т. Д. Теперь я узнаю, что это не разрешено в настройках ini по умолчанию (для allow_url_include установлено значение Off) после того, как я получил много предупреждений от сервера.

Я также заметил, что вы можете использовать include без скобок. Я попробовал это, и это работает, и я не получаю сообщений об ошибках или предупреждений. Два разных? То есть include () отличается от include ?

Ответы [ 4 ]

16 голосов
/ 30 мая 2010

Это недоразумение. Вы можете отключить включение удаленных файлов (используя URL-адрес http://www.example.com/include.php вместо пути файловой системы). Вы всегда можете включить локальные файлы.

Последнее связано с тем, что include не нормальная функция, а языковая конструкция. Как и die, его можно использовать с круглыми скобками или без них. Источник: Руководство

Поскольку include () - это специальная языковая конструкция, скобки вокруг его аргумента не нужны. Будьте внимательны при сравнении возвращаемого значения.

4 голосов
/ 30 мая 2010

Использование include () может привести к локальному включению файла (LFI) или Удаленному включению файла (RFI) Уязвимо . Вам следует избегать использования include, например, , если вы включаете HTML , лучше писать print(file_get_contents($file)), чем include($file). Однако include() использование PHP-файлов необходимо в большинстве приложений php для уменьшения дублирования кода.

Даже если удаленное включение файлов отключено, все еще возможно использовать систему с помощью Advanced LFI Attack .

Если вам нужно принять пользовательский ввод в include(), то вы должны убедиться, что он находится в белом списке:

$good_includes=array("contact","home","view");
if(in_array($_GET[page],$good_includes)){
    include("inc/".$_GET[page].".php");
}
0 голосов
/ 30 мая 2010

Функция include хороша для динамического ввода файлов. Если мы включаем файлы в цикл, это очень хорошо. Но если мы включаем файлы статически, мы должны использовать require. Вторая функция сделать в начале скрипта.

0 голосов
/ 30 мая 2010

Существует большая разница с include / require_once и require.

Основным отличием является сообщение об ошибке, если вы используете include в вашем приложении, PHP попытается загрузить файл, но если он не существует, он выдаст не фатальную ошибку (то есть ваш скрипт не остановится), если вы используя require, сценарий остановится и остановит обработку.

Используйте require для файлов, которые имеют основополагающее значение для вашего приложения, и используйте include в ваших шаблонах, потому что если есть ошибка, вы можете указать, чтобы она не отображалась, и, таким образом, пользователь не будет знать разницу, пока его не основной шаблон включения, такой как header.php

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

если вы включаете файлы извне вашего сервера, я бы использовал curl, если он установлен, или file_get_contents().

Надеюсь, это поможет вам.

просто примечание к require против require_once, require_once добавит логику, чтобы убедиться, что файл не включен более одного раза, т.е. вы не хотите объявлять подключение к базе данных более одного раза

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