Безопасное программирование в PHP: подключаемые файлы
Февраль 9, 2008
Так либо иначе, при написании систем, которые выходят за рамки простых «парсилок» и должны иметь разветвленную логику приложения, программисты используют параметры, принимаемые из адресной строки, в качестве идентификатора файла для включения.
Рассмотрим случай-попытку «выдирания» содержимого файла путем подстановки путей в адресную строку.
Если вы подключаете файлы через передаваемый параметр в адресной строке (например, адрес выглядит так: http://www.hacked-resource.com/script.php?file=guestbook.php) — это явная недоработка программистов, писавших вашу систему. В 99% ваша система будет использована для взлома вашего сервера. Примером может служить такая комбинация: http://www.hacked-resource.com/script.php?file=././././file
Не менее интересным фактом является то, что php восприимичив к спецсимволам рода перевода строки и конца строки — т.е. программист обязан сам следить за безопасностью своих скриптов. PHP обрывает имя и путь до файла при встрече этих символов. Пример — вы желаете загрузить файл в скрипт, который принимает (формально, конечно же) только файлы с расширением jpeg... а подсунуть ему можно нечто вроде /home/jeurey/Desktop/tesfile.bin\0.jpg (где '\0' является признаком конца строки).
Неродивые программисты, полагающиеся на проверки со стороны браузера очень разочаруются, ведь проверяемая строка (нулевой символ не воспримется js в текстовом поле) будет заканчиваться на jpeg/jpg... Так что, повнимательнее
Единственно-верным решением вашей проблемы может служить анализ POST/GET передаваемых данных на стороне сервера, перед началом обработки файлов. Например, просканировать все директории и составить список допустимых ко включению файлов, и на основе этих данных осуществлять фильтрацию. JS стоит использовать исключительно для помощипользователю, чтобы исключить его ошибку... Злонамерянные действия таким образом не отсеешь.
Безопасного Вам программирования
Февраль 10, 2008 в 22:42
Спасибо вам за этот материал