WEb практикум. Web'cepbep
Скачать 4.76 Mb.
|
if (isset($_GET['command'])) { if ($arr=file($_GET['command'])) { for ($i=0; $i { printf(" %s", $arr[$i]); } } } ?> Параметр, через который передается имя файла, никак не проверяется на допустимые символы, а значит, хакер сможет просмотреть любой файл, на чтение которого у него хватит прав доступа. Просматривая конфигурационные файлы, хакер может найти важные данные, а возможно, и пароли доступа к web-серверу (см. главу 3). Ошибка очень похожа на проблему include (см. разд. 3.1.2), разница только в том, что в данном случае вы можете только просмотреть файлы, но код в них не будет выполняться, как при подключении. Некоторые программисты предпочитают использовать вместо include простое чтение файлов. Согласен и поддерживаю это решение. Если файл не содержит PHP- кода, а только HTML, то его лучше прочитать и отобразить на web-странице. Таким образом, даже если вы забудете где-то проверить параметр, хакер сможет только просматривать файлы, но не сможет внедрить свой PHP-код в сценарий, что намного опаснее. Код выполняться не будет, но просмотреть важную информацию будет все еще возможно, например увидеть /etc/passwd. Если полученное имя без проверок используется при записи файла, то тут уже совсем иное. Допустим, что нам необходим сценарий, что-то вроде гостевой книги или книги отзывов. В зависимости от типа вопроса пользователя мы должны будем поместить введенный вопрос в тот или иной файл. Имя файла и сохраняемые данные будем передавать методом get, хотя и другой метод передачи защищенным назвать нельзя. Упрощенный вариант решения данной задачи можно увидеть в листинге 4.4. Листинг 4.4. Сохранение введенных пользователем данных Inj ection testform action="file.php?command=questions/user.txt" method="get"> Question: if (isset($_GET['command'])) { if ($f=fopen($_GET['command'] , "w+")) print("File: ($f)"); else die("Error"); $s = fwrite($f, $_GET['param']); fclose($f); } ?> Смысл сценария прост. В свойстве формы action указывается URL: file.php?command=questions/user.txt. Помимо сценария в URL указан еще и параметр command, в котором прописано имя файла для записи данных. Несмотря на то, что параметр прописан, изменить его очень просто. Через параметр param передается текст, который нужно записать в файл. Если файл главной web-страницы имеет имя index.php и доступен на запись, то можно выполнить следующий URL: http://servername/file.php?command=mdex.php¶m= |