2010-01-29 1 views

ответ

3

Да. Во-первых, вы никогда не должны использовать переменные 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]); 
} 

(. В этом случае, тот факт, что только указанные ключи допускаются действует как проверки и ограничения на то, что могут быть включены)

+1

Подробнее о том, как использовать такие вещи здесь: http://ha.ckers.org/blog/20100128/micro-php-lfi-backdoor/, в комментариях есть много всего. – Arkh

1

Это риск, потому что в $_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 !'); 
} 

Хорошая вещь также проверить, если файл существует.

1

Вы по существу предоставляете им возможность выполнять ЛЮБОЙ фрагмент PHP, существующий в вашей системе. Это довольно большая неизвестность.

В принципе, это опасно, потому что даже если на данный момент нет «опасного» кода, возможно, в будущем.

+3

Они могут читать любой файл, потому что include в php не должен содержать php-код. Если нет , тогда php просто выгрузит содержимое файла там. – SoapBox

+0

Определенно должен был заметить это также! – cgp

1

А также иметь белый список, вы могли бы сделать что-то вроде этого

$include = $_GET['page']; 

if (! preg_match('/^[a-z-_]+$/i', $include)) { 
    throw new Exception('Access denied'); 
} 
1

включают "страницы /".$_ GET [" страницы "] PHP".".

Тот факт, что вы жестко закодированы префикс предотвращает атаки, как:

страница = HTTP% 3A% 2F% 2Fwww.blackhat.com% 2Fbad.code% 3F

Но потому что $ _GET ['page'] может включать «..», тогда кто-то может принудительно включить любой файл с расширением php из вашей системы. Вы уверены, что это никогда не приведет к компрометации безопасности?

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

C.