Forum Webscript.Ru
Программирование => PHP => Тема начата: mar от 15 Марта 2003, 18:25:13
-
вопрос:
- исполбзуя include, подключаю какой-нибудь ini- файл с переменными.
- еслии не хочу значений по умолчанию, вызываю свой script.php?ini=qq.ini (т.е. передаю имя файла)
Есть ли возможность сделать это безопасно? (пока получается, что ежели кто-нибудь загонит какой-нибудь файл с включением php и вызовет такой скрипт со ссылкой на него, то будет выполнен любой произвольный код в этот файл помещенный???
-
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 у подключаемых файлов.
-
Макс
спасибо
НО: я делаю скрипт не для себя. Собственно, для того и ini файлы, чтобы скрипт не корежить. т.е. люди будут добавлять эти ini сколько угодно, когда взгрустнется :)
я подумала: м.б. загнать все шаблоны и служебные файлы в какой-нибудь каталог, а потом к переданному значению $ini в начало добавлять его значение. Тогда параметр hackrescript превратится в mydir/hackrescript и атака потеряет смысл
кстати, в phpclub http://phpclub.net/talk/showthread.php?s=&postid=183902#post183902 мне подсказали то же, что и ты. Прошу прощения за чайникрвский вопрос: это что, стандартное решение? (мне мало приходилось писать нае PHP, больше на Perl-е)
-
Тогда параметр 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");
}
...
?>
-
Макс
Да, так, пожалуй, можно и уйти от статики (когда все подключаемые страницы стоят заранее). Но я, пожалуй, дам им возможность называть файлы, как хотят :)
вот что на сейчас получилось:
$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-файла
}
-
я бы все-таки посоветовал не писать в URL-е полное имя файла:
script.php?ini=aaa (то есть без .php
а в скрипте очищать его от всех "левых" символов
$ini = $work.preg_replace("#[^a-zA-Z0-9_]#", "", $_GET[\'ini\']).".php";
include(is_file($ini)?$ini:$defaultini);
-
насчет .php, наверное (хотя в моем случае при попытке "посмотреть" этот php, можно будет увидеть пустое окно: там только пары переменная-значение )
а вот о способах очистки: неужели basename() может оказаться недостаточно??
-
В вопросах безопасности я немного параноик ;)
Я бы еще твою папку с файлами через .htaccess закрыл:
deny from all
чтобы файлы нельзя было вызывать напрямую через броузер.
basename() почти наверняка будет достаточно, но я все равно бы сделал такую очистку.