Так либо иначе, при написании систем, которые выходят за рамки простых “парсилок” и должны иметь разветвленную логику приложения, программисты используют параметры, принимаемые из адресной строки, в качестве идентификатора файла для включения. Как бы это не было удобно - это небезопасно, как минимум.
Рассмотрим случай-попытку “выдирания” содержимого файла путем подстановки путей в адресную строку.
Если вы подключаете файлы через передаваемый параметр в адресной строке (например, адрес выглядит так: 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.jpg\0.jpg (где ‘\0′ является признаком конца строки).
Неродивые программисты, полагающиеся на проверки со стороны браузера очень разочаруются, ведь проверяемая строка (нулевой символ не воспримется js в текстовом поле) будет заканчиваться на jpeg/jpg… Так что, повнимательнее
Единственно-верным решением вашей проблемы может служить анализ POST/GET передаваемых данных на стороне сервера, перед началом обработки файлов. Например, просканировать все директории и составить список допустимых ко включению файлов, и на основе этих данных осуществлять фильтрацию. JS стоит использовать исключительно для помощипользователю, чтобы исключить его ошибку… Злонамерянные действия таким образом не отсеешь.
Безопасного Вам программирования ![]()
Оригинал статьи “Безопасное программирование в PHP: подключаемые файлы”

{ 0 comments… add one now }
Leave a Comment