Соответствие введенного пользователем относительного URL с preg_match - PullRequest
1 голос
/ 05 февраля 2010

У меня есть проект, который требует , используя пользовательский ввод для включения файлов в скрипт PHP. Пользовательский ввод может быть любым относительным URL (например: /folder1/folder2/file.jpg, / folder1 / folder2 /)

Будет ли следующее регулярное выражение для проверки правильности ввода:

if(preg_match('/^(\/[-_a-zA-Z0-9]+)+\/?$/D', $_GET['loc']))
{
   //Location is good!
}

Очевидно, я стремлюсь избежать любых локальных атак на включение файлов. Прежде чем я получу предложения из белого списка вместо того, чтобы включать файл, как указано выше, у меня есть тысячи файлов, поэтому оператор switch или if / else не сработает.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2010

Вы можете поместить все файлы для включения в один каталог, скажем /x/y/data а затем выполните проверку, как показано ниже:

$filename = realpath("/x/y/data/$_POST[location]");

// Make sure that $filename is under /usr/local/data    
if ('/x/y/data/' =  = substr($filename, 0, 10)) {

// safe..include the file.

} else {    

// not safe..reject.   

}
1 голос
/ 05 февраля 2010

Я бы создал белый список всех допустимых файлов и разрешил файлы только в соответствии с этим. Если это по какой-то причине нецелесообразно, я бы неохотно попробовал какое-то регулярное выражение (но разделители путей различаются в зависимости от платформы, так что удачи). Обязательно заблокируйте эту вещь с помощью директивы php open_basedir. Это, по крайней мере, минимизирует ущерб в случае, если что-то случится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...