Как обезопасить передаваемые скрипту данные

Setor

Новичок
Как обезопасить передаваемые скрипту данные

Используя ошибку в PHP можно заинклудить произвольный файл в подобном коде:

PHP:
<?php // index.php
include('/some_dir/' . $_GET['page'] . '.php');
?>
Если следующим образом составить запрос: some_site/?page=other_file%00

Какие есть соображения?

Так же хотелось бы узнать, существуют ли ещё подобные уязвимости в PHP? И методы их устранения.
 

Kirs

Fireman
существуют ли ещё подобные уязвимости в PHP
:)
используй народный способ, типа того:
PHP:
if (isset($_GET['page'])) {
  switch ($_GET['page']) {
     case "file1":
        include("/some_dir/file1.php");
        break;
     case "file2":
        include("/some_dir/file2.php");
        break;
     ....
     default
        include(("/some_dir/hacker.php");
  }
}
 

Gas

может по одной?
существуют ли ещё подобные уязвимости в PHP
Это не уязвимости PHP. Кривую программу можно сделать на любом языке если не задумываться над тем, что делаешь.

-~{}~ 14.12.04 19:09:

Самое главное правило - проверять все данные пришедшие от пользователя.
 

Фанат

oncle terrible
Команда форума
Setor
Какие есть соображения?
соображения такие.
не изображать из пхп веб-сервер, и не писать программу для показа других программ.
а обращаться к скриптам напрямую.

подобные уязвимости неисчислимы.
обо всех о них можно почитать в разнообразных статьях на этом сайте.

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

Ilya

Новичок
конечно, это старая дырка....даже не дырка =)))
а так...


просто не передавать имени файла в запросе и все.. =)
 

Setor

Новичок
Kirs
а если страниц 1000? твой метод не идеален...

Gas
я какраз и задумываюсь над тем, что делаю, иначе бы этого топика тут не возникло!

Не надо разводить флейм.

-~{}~ 14.12.04 19:17:

Автор оригинала: Фанат
подобные уязвимости неисчислимы.
обо всех о них можно почитать в разнообразных статьях на этом сайте.
В данном примере PHP ведёт себя не так, как мы ожидаем. Ты скорей всего имеешь ввиду ошибки программиста. А тут явно не моя ошибка.

-~{}~ 14.12.04 19:24:

Как вариант решения проблемы - отвергать все данные, содержащие постороние символы. Есть ещё варианты?

"не передавать имени файла в запросе" - годится далеко не во всех случаях.
 

Kirs

Fireman
Setor, Фанат
Если бы было 1000 страниц, он бы задавал совершенно другие вопросы. Да и наконец понял, что данный способ хреновй... очень.
 

Фанат

oncle terrible
Команда форума
В данном примере PHP ведёт себя не так, как мы ожидаем
не понял.
ну-ка, поподробнее - что ты ожидаешь, и как себя ведет пхп.
очень интересно.
А тут явно не моя ошибка.
и чья же?
и в чем конкретно она заключается?
 

SiMM

Новичок
Конечно же, PHP, зараза такая, во всём виноват. А ручки, конечно же, растут оттуда, откуда и должны, и абсолютно прямы.
 

Setor

Новичок
Фанат
Мы НЕ ожидаем, что при
PHP:
include('/some_dir/' . $_GET['page'] . '.php');
отбросится расширение ".php"!

Я не знаю на каком уровне возникает эта ошибка (глюк файловой системы, ф-ций include/require или ещё чего).

Если бы я инклудил просто необъявленную заранее переменную
PHP:
include($undefined_variable);
, то это уже моя ошибка - юзер имеет возможность подставить путь к своему файлу.

И уже совсем для дураков объясняю, если я ожидаю, что
PHP:
echo($some_var);
отобразит мне содержимое переменной $some_var, то я вовсе не ожидаю, что эта функция в данном примере отобразит мне содержимое переменной $password.
 

Фанат

oncle terrible
Команда форума
непонятно, чего ты так кипятишься.
это ВСЁ твоя ошибка - с %00 или без.
по-твоему, если у файла расширение не отбросится, это сделает чужой ПХП файл менее опасным?

И вообще - смени тон.

-~{}~ 14.12.04 23:21:

Если бы я инклудил просто необъявленную заранее переменную
include($undefined_variable);
, то это уже моя ошибка - юзер имеет возможность подставить путь к своему файлу.
а что сейчас юзер не имеет, что ли, возможности заинклюдить свой пхп файл?
какая разница вообще - отбрасывается ли расширение?
какая разница - при чем тут вообще расширение?
 

Kirs

Fireman
Setor
Ты не прав. Тебе объясили - или делай в "своем" стиле (через switch), или меняй логику скрипта (что предпочтительней). А вот по частностям - тебе здесь все подробно объяснят.
 

Setor

Новичок
Фанат
Если взять именно тот пример, что я привёл сначала, то ты прав. Но его можно и модифицировать. Не будем лезть в дебри.

Ладно, проехали. Я хотел лишь посоветоваться, как отфильтровать этот знак. Тема (для меня) закрыта.

Kirs
я уже не первый год пишу на PHP. Не считаю себя новичком.
 

Фанат

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

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

Kirs

Fireman
Setor дык вообще всё инородное нельзя допускать до скрипта. Программист должен быть параноиком.
 

Фанат

oncle terrible
Команда форума
Kirs
твои ответы в этой теме совершенно излишни.
воздержись.
 

SiMM

Новичок
Автор оригинала: Kirs
Программист должен быть параноиком.
и не переступать черту особого фанатизма, граничащего с идиотизмом ;)
PS: слово "фанатизм" прошу понимать в буквальном смысле, ознакомившись с ним предварительно в словаре ;)
 

Setor

Новичок
Фанат
Под стандартными средствами подразумеваются стандартные ф-ции PHP или свои?

Вроде как фильтруется без ошибок.
PHP:
$test = str_replace( chr( '%00' ), '', $test );
-~{}~ 14.12.04 22:50:

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

Фанат

oncle terrible
Команда форума
стандартные.
я обрабатываю все, что подставляется в файловые функции, через basename и перед чтением проверяю через is_readable
сейчас проверил - basename фильтрует 00.

Но сам факт интересный, я не знал.
Спасибо, что ткнул носом.

-~{}~ 14.12.04 23:57:

SiMM
возьми, да выполни код, который он показал
 
Сверху