П О Р Т А Л                            
С Е Т Е В Ы Х                          
П Р О Е К Т О В                        
  
Поиск по сайту:
                                                 
Главная

О проекте

Web-мастеру
     HTML & JavaScript
     SSI
     Perl
     PHP
     XML & XSLT
     Unix Shell

MySQL

Безопасность

Хостинг

Другое








Самое читаемое:

Учебник PHP - "Для Чайника".
Просмотров 176967 раз(а).

Иллюстрированный самоучитель по созданию сайтов.
Просмотров 74130 раз(а).

Учебник HTML.
Просмотров 73311 раз(а).

Руководство по PHP5.
Просмотров 44189 раз(а).

Хостинг через призму DNS.
Просмотров 50875 раз(а).

Подборка текстов стандартных документов.
Просмотров 44364 раз(а).

Учебник PHP - Самоучитель
Просмотров 50611 раз(а).

Документация на MySQL (учебник & справочное руководство)
Просмотров 51027 раз(а).

Внешние атаки...
Просмотров 41337 раз(а).

Учебник PHP.
Просмотров 36566 раз(а).

SSI в примерах.
Просмотров 27439 раз(а).



 
 
| Добавить в избранное | Сделать стартовой | Помощь




Руководство по PHP
Пред. След.

Глава 26. Безопасность файловой системы

PHP является одним из важных моментов в вопросе безопасности сервера, поскольку PHP-скрипты могут манипулировать файлами и каталогами на диске. В связи с этим существуют конфигурационные настройки, указывающие, какие файлы могут быть доступны и какие операции с ними можно выполнять. Необходимо проявлять осторожность, поскольку любой из файлов с соответствующими правами доступа может быть прочитан каждым, кто имеет доступ к файловой системе.

Поскольку в PHP изначально предполагался полноправный пользовательский доступ к файловой системе, можно написать скрипт, который позволит читать системные файлы, такие как /etc/passwd, управлять сетевыми соединениями, отправлять задания принтеру, и так далее. Как следствие вы всегда должны быть уверены в том, что файлы, которые вы читаете или модифицируете, соответствуют вашим намерениям.

Рассмотрим следующий пример, в коротом пользователь создал скрипт, удаляющий файл из его домашней директории. Предполагается ситуация, когда веб-интерфейс, написанный на PHP, регулярно используется для работы с файлами, и настройки безопасности позволяют удалять файлы в домашнем каталоге.

Пример 26-1. Недостаточная проверка внешних данных.

<?php
// Удаление файла из домашней директории пользователя
$username = $_POST['user_submitted_name'];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ("$homedir/$userfile");
echo
"$file_to_delete has been deleted!";
?>
Поскольку переменные вводятся в пользовательской форме, существует возможность удалить файлы, принадлежащие кому-либо другому, введя соответствующие значения. В этом случае может понадобиться авторизация. Посмотрим, что произойдет, если будут отправлены значения "../etc/" и "passwd". Скрипт выполнит следующие действия:

Пример 26-2. Атака на файловую систему

<?php
// Удаление любого файла, доступного из PHP-скрипта.
// В случае, если PHP работает с правами пользователя root:
$username = "../etc/";
$homedir = "/home/../etc/";
$file_to_delete = "passwd";
unlink ("/home/../etc/passwd");
echo
"/home/../etc/passwd has been deleted!";
?>
Cуществуют два решения описанной проблемы.

  • Ограничить доступ пользователя, с правами которого работает веб-сервер.

  • Проверять все данные, вводимые пользователем.

Вот улучшеный вариант кода:

Пример 26-3. Более безопасная проверка имени файла

<?php
// Удаление любого файла, доступного из PHP-скрипта.
$username = $_SERVER['REMOTE_USER']; // использование авторизации

$homedir = "/home/$username";

$file_to_delete = basename("$userfile"); // усечение пути
unlink ($homedir/$file_to_delete);

$fp = fopen("/home/logging/filedelete.log","+a"); //логируем удаление
$logstring = "$username $homedir $file_to_delete";
fwrite ($fp, $logstring);
fclose($fp);

echo
"$file_to_delete has been deleted!";
?>
Однако и такая проверка не учитывает все возможные ситуации. Если система авторизации позволяет пользователям выбирать произвольные логины, вломщик может создать учетную запись вида "../etc/" и система опять окажется уязвимой. Исходя из этого, вам может понадобиться более строгая проверка:

Пример 26-4. Более строгая проверка имени файла

<?php
$username
= $_SERVER['REMOTE_USER']; // использование авторизации
$homedir = "/home/$username";

if (!
ereg('^[^./][^/]*$', $userfile))
     die(
'bad filename'); //завершение работы

if (!ereg('^[^./][^/]*$', $username))
     die(
'bad username'); //завершение работы
//etc...
?>

В зависимости от используемой вами операционной системы необходимо предусматривать возможность атаки на разнообразные файлы, включая системные файлы устройств (/dev/ или COM1), конфигурационные файлы (например /etc/ или файлы с расширением .ini), хорошо известные области хранения данных (/home/, My Documents), и так далее. Исходя из этого, как правило, легче реализовать такую политику безопасности, в которой запрещено все, исключая то, что явно разрешено.


Пред. Начало След.
Если PHP установлен как модуль Apache Уровень выше Безопасность баз данных


Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
 





Copyright © 2005-2016 Project.Net.Ru