Имеет ли следующая информация о наличии угрозы безопасности?Безопасность и включает данные на основе URL-адресов
include "pages/".$_GET["page"].".php";
Если да:
- почему?
- Какой был бы более безопасный подход?
Имеет ли следующая информация о наличии угрозы безопасности?Безопасность и включает данные на основе URL-адресов
include "pages/".$_GET["page"].".php";
Если да:
- почему?
- Какой был бы более безопасный подход?
Да. Во-первых, вы никогда не должны использовать переменные GET напрямую без какой-либо проверки, никогда.
Кроме того, вы не должны допускать произвольную спецификацию пути для включения.
Вместо этого вы должны либо ограничить включение в пути определенным определенным образом (и проверить, что указанный путь относится к файлу в этом каталоге), если вы абсолютно требуете такой большой динамичности, или вместо этого вы должны передавать токены, которые ссылаются к вещам, которые вы хотите включить (и затем сделать что-то вроде поиска в ассоциативном массиве, чтобы увидеть, к какому файлу относится данный токен).
Примером последнего было бы что-то вроде этого:
$allowed_pages = array(
"page1" => "pages/page1.php",
"page2" => "pages/page2.php",
"foobar" => "pages/page7.php",
"stuff" => "pages/blarg.php"
);
$page = $_GET['page'];
if(array_key_exists($allowed_pages, $page)) {
include($allowed_pages[$page]);
}
(. В этом случае, тот факт, что только указанные ключи допускаются действует как проверки и ограничения на то, что могут быть включены)
Это риск, потому что в $_GET["page"]
может быть путь, за которым вы не исключаете - в примере ../../settings.php
на что-то еще.
Это должно быть сделано как:
$allowedPages = array('news', 'contact', ...);
if (in_array($_GET["page"], $allowedPages)) {
include "pages/".$_GET["page"].".php";
} else {
throw new Exception('Page is not valid !');
}
Хорошая вещь также проверить, если файл существует.
Вы по существу предоставляете им возможность выполнять ЛЮБОЙ фрагмент PHP, существующий в вашей системе. Это довольно большая неизвестность.
В принципе, это опасно, потому что даже если на данный момент нет «опасного» кода, возможно, в будущем.
А также иметь белый список, вы могли бы сделать что-то вроде этого
$include = $_GET['page'];
if (! preg_match('/^[a-z-_]+$/i', $include)) {
throw new Exception('Access denied');
}
включают "страницы /".$_ GET [" страницы "] PHP".".
Тот факт, что вы жестко закодированы префикс предотвращает атаки, как:
страница = HTTP% 3A% 2F% 2Fwww.blackhat.com% 2Fbad.code% 3F
Но потому что $ _GET ['page'] может включать «..», тогда кто-то может принудительно включить любой файл с расширением php из вашей системы. Вы уверены, что это никогда не приведет к компрометации безопасности?
Использование белого списка, как предложено другими, намного безопаснее, а также устраняет необходимость префикса пути, чтобы избежать уязвимостей удаленного включения.
C.
Подробнее о том, как использовать такие вещи здесь: http://ha.ckers.org/blog/20100128/micro-php-lfi-backdoor/, в комментариях есть много всего. – Arkh