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

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

PHP:
$a = 2;
include ("tmp/".$_GET['data']);
не сработает
 
Автор оригинала: Фанат
не нало гоняться за возможными сочетаниями.
Надо сразу оставить в переменной только разрешенные.
как я написал выше - регом или функцией basename()
Неа ...
Согласен, про ../ я неподумал сразу, надо внести корректировочку
однако все не так страшно
etc/passwd все же не удастся посмотреть т.к. еще расширение .php приписывается
так что максимум какой-нибудь php файл вызвать можно ... если знать его имя
что безусловно тоже не хорошо ... посему предлагается отсечь опасные сочетания
тем же basename например или str_replace

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

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

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

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

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


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

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

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

+RewriteRule

Спасет
 
лучше сделать так:
$legal_file = array( 'mname1', 'mname2' ); и т.п.
а дальше in_array...
или через switch. так все равно небезопасно
 
а символ "/" - это буква или цифра?
а RewriteRule здесь при чем?

-~{}~ 30.11.06 16:10:

Sender
почему лучше менять скрипт при добавлении каждого нового файла?
почему все равно небезопасно?
 
Yo!
а зачем вы проверяете некий урл на предмет неких символов? и как эти символы должны влиять на include ???
 
Фанат
долго думал :) я лично бы basename+regexp не пробил бы. сделать можно. только вот все равно уверенности не будет на 100%. И потом если такое чудо увидит кто-нибудь будут долго смеяться и попробуй им объясни что это безопасно :)
 
опять не понял.
кто будет смеяться и почему?
какие проблемы объяснить, что это безопасно?
 
другие программисты будут смеятся.
почему? потому что это считается очень небезопасно так делать
 
смеяться будут дураки.
считается, что небезопасно - дураками.
на мнение дураков обращать внимание не стоит
 
$file = $_GET['filename'];
if (in_array($file, $arrayOfAllowedFiles)) {
$filename = 'dir_for_include/'.$_GET['filename'].'.php';
include_once($filename);
}
else {
/* obrabotka nepravilinih failov. naprimer die() */
}

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