Безопасное программирование в 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 стоит использовать исключительно для помощипользователю, чтобы исключить его ошибку... Злонамерянные действия таким образом не отсеешь.

Безопасного Вам программирования ;)

1 комментарий на “Безопасное программирование в PHP: подключаемые файлы”

  1. Оптимизатор высказал:

    Спасибо вам за этот материал :)