Forum Webscript.Ru

Программирование => PHP => Тема начата: mar от 15 Марта 2003, 18:25:13

Название: include, ini-файлы и безопасность - help, pls
Отправлено: mar от 15 Марта 2003, 18:25:13
вопрос:
- исполбзуя include, подключаю какой-нибудь ini- файл с переменными.
- еслии не хочу значений по умолчанию, вызываю свой script.php?ini=qq.ini (т.е. передаю имя файла)
Есть ли возможность сделать это безопасно? (пока получается, что ежели кто-нибудь загонит какой-нибудь файл с включением php и вызовет такой скрипт со ссылкой на него, то будет выполнен любой произвольный код в этот файл помещенный???
Название: include, ini-файлы и безопасность - help, pls
Отправлено: Макс от 15 Марта 2003, 18:30:29
script.php?ini=1
В скрипте примерно так сделай:

$ini_files = array(
"1"=>"qq.ini",
"2"=>"qqq.ini",
);
if (isset($_GET[\'ini\']) && array_key_exists($_GET[\'ini\'], $ini_files)) {
   include($ini_files[$_GET[\'ini\']]);
}

и лучше поменяй расширение на php у подключаемых файлов.
Название: include, ini-файлы и безопасность - help, pls
Отправлено: mar от 15 Марта 2003, 23:19:36
Макс
спасибо
НО: я делаю скрипт не для себя. Собственно, для того и ini файлы, чтобы скрипт не корежить. т.е. люди будут добавлять эти ini сколько угодно, когда взгрустнется :)

я подумала: м.б. загнать все шаблоны и служебные файлы в какой-нибудь каталог, а потом к переданному значению $ini в начало добавлять его значение. Тогда параметр hackrescript превратится в mydir/hackrescript и атака потеряет смысл

кстати, в phpclub http://phpclub.net/talk/showthread.php?s=&postid=183902#post183902 мне подсказали то же, что и ты. Прошу прощения за чайникрвский вопрос: это что, стандартное решение? (мне мало приходилось писать нае PHP, больше на Perl-е)
Название: include, ini-файлы и безопасность - help, pls
Отправлено: Макс от 16 Марта 2003, 01:04:28
Цитировать
Тогда параметр hackrescript превратится в mydir/hackrescript и атака потеряет смысл
сходу дыру не найду, но возможно всякие вариации с ../hackerscript и ../../hackerscript . В любом случае, решение предложеное тебе на обоих форумах стандартное и проверенное временами.
Как вариант можеш положить настройки в файлы
1.ini, 2.ini и т.д.
и подключать : script.php?ini=1
$ini = max(1, intval($_GET[\'ini\']));
if (is_file(\'./mydir/\'.$ini.".ini")) {
include(\'./mydir/\'.$ini.".ini");
} else {
include(\'./mydir/1.ini");
}
...
?>
Название: include, ini-файлы и безопасность - help, pls
Отправлено: mar от 16 Марта 2003, 23:57:03
Макс
Да, так, пожалуй, можно и уйти от статики (когда все подключаемые страницы стоят заранее). Но я, пожалуй, дам им возможность называть файлы, как хотят :)
вот что на сейчас получилось:

$work="qq/"; //рабочий каталог с включаемыми файлами
$defaultini=$work. "qq.php";
// вводим значения по умолчанию (из ini-файлов)
if (!@$ini)$ini=$defaultini; // если нет вызова , ini - по-умолчанию
else {$ini=basename($ini);} // отрезаем путь
$ini=$work. $ini; // добавляем в начало имя каталога

if (!file_exists($ini)) { // а вдруг ошиблись
 include ($defaultini);  // включаем по умолчанию
} else {
 include ($ini);  // включаем из ini-файла
}
Название: include, ini-файлы и безопасность - help, pls
Отправлено: Макс от 17 Марта 2003, 01:53:58
я бы все-таки посоветовал не писать в URL-е полное имя файла:
script.php?ini=aaa (то есть без .php
а в скрипте очищать его от всех "левых" символов

$ini = $work.preg_replace("#[^a-zA-Z0-9_]#", "", $_GET[\'ini\']).".php";
include(is_file($ini)?$ini:$defaultini);
Название: include, ini-файлы и безопасность - help, pls
Отправлено: mar от 17 Марта 2003, 02:32:27
насчет .php, наверное (хотя в моем случае при попытке "посмотреть" этот php, можно будет увидеть пустое окно: там только пары переменная-значение )
а вот о способах очистки: неужели basename() может оказаться недостаточно??
Название: include, ini-файлы и безопасность - help, pls
Отправлено: Макс от 17 Марта 2003, 18:29:30
В вопросах безопасности я немного параноик ;)
Я бы еще твою папку с файлами через .htaccess закрыл:
deny from all чтобы файлы нельзя было вызывать напрямую через броузер.
basename() почти наверняка будет достаточно, но я все равно бы сделал такую очистку.