включение файла c именем в URL

MadGreen

meninweb
да, я ошибся
PHP:
$a = 2;
include ("tmp/".$a=str_replace('2','1',$a));
заменит переменную, но

PHP:
$a = 2;
include ("tmp/".$_GET['data']);
не сработает
 

AlexBB

Новичок
Автор оригинала: Фанат
не нало гоняться за возможными сочетаниями.
Надо сразу оставить в переменной только разрешенные.
как я написал выше - регом или функцией basename()
Неа ...
Согласен, про ../ я неподумал сразу, надо внести корректировочку
однако все не так страшно
etc/passwd все же не удастся посмотреть т.к. еще расширение .php приписывается
так что максимум какой-нибудь php файл вызвать можно ... если знать его имя
что безусловно тоже не хорошо ... посему предлагается отсечь опасные сочетания
тем же basename например или str_replace

Ваш же подход еще более уязвим. Допустим Вы ограничили регекспами допустимый ввод
Ну допустим не более 10 латинских букв ... таких сочетаний куева туча.
В урле можно скормить допустимое сочетание, при этом файла такого не будет
В итоге, если включено отображение ошибок, include ругнется и раскажет кое что про файловую систему
после чего можно вызвать скрипты из директории dir_for_include напрямую, которые возможно опять ругнуться
Потенциально тоже дыра. Да и просто вызов ошибок из строки url - есть нехорошо.

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

Фанат

oncle terrible
Команда форума
В урле можно скормить допустимое сочетание, при этом файла тагого не будет
В итоге, если включено отображение ошибок, include ругнется
ты бредишь?
с чего ты решил, что я НЕ СОБИРАЮСЬ делать проверку существования файла?
Не надо передергивать мои слова. Эта проверка не имеет отношения к БЕЗОПАСНОСТИ. Я говорил только об этом.
раскажет кое что про файловую систему
НАСТРАИВАТЬ ПХП надо руками, а не другим местом! Тогда никто ничего никому рассказывать не будет.
Ты знаком с параметром настройки display_errors и тем значением, которое он добязан иметь на работающем сайте?

Остальное бессвязное бормотание я вообще не понял. К чему это все? Ты рассуждаешь, как хитро извернуться, чтобы обойтись без проверки файла на существование? А ЗАЧЕМ?

Что, блин, за ограниченность-то такая? почему обязательно надо применять что-то ОДНО? "Если делаем регэксп, то отказываемся от проверки на существоание". Как тебе такая мысль в голову вообще могла придти, что ты потратил аж половину своего сообщения на ее обсуждение?
 

AlexBB

Новичок
По моему, это Вы передергиваете. Где я написал, что если делаем проверку существования, то отказываемся от валидации. Наоборот цитирую себя:

посему предлагается отсечь опасные сочетания
тем же basename например или str_replace


Про настройку ПХП не надо мне рассказывать. Человек, котрый задал это вопрос может про нее не знать, а просто выложить сайт на сторонний хостинг. Кроме того использование директивы display_errors=0 еще не повод писать скрипты порождающие ошибки. Разве нет?

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

Yo!

Новичок
imxo

if(preg_match("/^[a-zA-Z0-9\/]+$/",$_SERVER["REQUEST_URI"])) { include.... }

+RewriteRule

Спасет
 

Sender

Новичок
лучше сделать так:
$legal_file = array( 'mname1', 'mname2' ); и т.п.
а дальше in_array...
или через switch. так все равно небезопасно
 

Фанат

oncle terrible
Команда форума
а символ "/" - это буква или цифра?
а RewriteRule здесь при чем?

-~{}~ 30.11.06 16:10:

Sender
почему лучше менять скрипт при добавлении каждого нового файла?
почему все равно небезопасно?
 

Андрейка

Senior pomidor developer
Yo!
а зачем вы проверяете некий урл на предмет неких символов? и как эти символы должны влиять на include ???
 

Sender

Новичок
Фанат
долго думал :) я лично бы basename+regexp не пробил бы. сделать можно. только вот все равно уверенности не будет на 100%. И потом если такое чудо увидит кто-нибудь будут долго смеяться и попробуй им объясни что это безопасно :)
 

Фанат

oncle terrible
Команда форума
опять не понял.
кто будет смеяться и почему?
какие проблемы объяснить, что это безопасно?
 

Sender

Новичок
другие программисты будут смеятся.
почему? потому что это считается очень небезопасно так делать
 

Фанат

oncle terrible
Команда форума
смеяться будут дураки.
считается, что небезопасно - дураками.
на мнение дураков обращать внимание не стоит
 

alexei.lexx

Новичок
$file = $_GET['filename'];
if (in_array($file, $arrayOfAllowedFiles)) {
$filename = 'dir_for_include/'.$_GET['filename'].'.php';
include_once($filename);
}
else {
/* obrabotka nepravilinih failov. naprimer die() */
}

Про это писалось уже миллионы раз.
 
Сверху