Новые книги

Под этой обложкой головокружительная история рождения, взросления и успеха всемирно известной компании, сделавшей миллиардером... самого Стива Джобса! Временно, на момент основания компании, безработного.

О компании, которую знают все, даже если не помнят названия. О компании, которая началась с абсолютно безумной фантазии.

Нет, вовсе не об Apple. Герой этой книги — анимационная студия Pixar, сверх-успешная компания, совершившая техническую революцию и навсегда изменившая киноиндустрию. Прайс рассказывает и о том, как создавалась Pixar, и о том, чем заняты ее сотрудники сегодня.

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

Издание предназначено не только для лидеров команд и менеджеров высшего звена, но и для программистов, тестеров и других исполнителей конкретных проектных заданий. Также оно будет полезно студентам, изучающим бизнес-менеджмент, проектирование изделий или программную инженерию.

Текст нового издания значительно переработан автором с целью добиться большей ясности, кроме того, книга дополнена новым приложением и более чем 120 практическими упражнениями.

Безопасность Файловой Системы

Учебник РНР
НазадГлава 4. Безопасность Вперёд

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

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

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

Рассмотрим следующий скрипт, где пользователь указывает, что он хотел бы удалить файл в своей home-директории. Это предполагает ситуацию, когда web-интерфейс РНР регулярно используется для работы с файлами, как в случае, когда пользователь сервера Apache может удалять файлы в своих домашних директориях.

Пример 4-1. Плохая проверка переменных ведёт к ...
<?php
// удалить файлы из домашней директории пользователя
$username = $_POST['user_submitted_name'];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ($homedir/$userfile);
echo "$file_to_delete has been deleted!";
?>

Поскольку username отправляется из пользовательской формы методом post, можно отправлять username и файл, принадлежащие кому-либо ещё, и удалять файлы. В этом случае может понадобиться использование какой-нибудь иной формы аутентификации. Посмотрим, что произойдёт, если будут отправлены переменные "etc/" и "passwd". Код тогда сможет эффективно читать:

Пример 4-2. ... атака на файловую систему
<?php
// Удалить файл с жёсткого диске, доступ к которому имеет пользователь РНР.
// Если РНР имеет root-доступ:
$username = "etc/";
$homedir = "/home/etc/";
$file_to_delete = "passwd";
unlink ("/home/etc/passwd");
echo "/home/etc/passwd has been deleted!";
?>

Есть два средства, которые вы должны использовать для предотвращения такого поведения.

  • Давать web-пользователю только ограниченный доступ к экзешнику PHP.

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

Вот улучшенный скрипт:
Пример 4-3. Более безопасная проверка имени файла
<?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"); //log удаление
$logstring = "$username $homedir $file_to_delete";
fputs ($fp, $logstring);
fclose($fp);

echo "$file_to_delete has been deleted!";
?>

Однако и здесь не без недостатков. Если ваша система аутентификации разрешает пользователям создавать свои собственные пользовательские login'ы и пользователь выберет логин "etc/", система снова станет открытой. Исходя из этого, вам может понадобиться более специализированная проверка:

Пример 4-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), etc.
Поэтому обычно легче реализовать такую политику, когда вы запрещаете всё, за исключением того, что явно разрешено.


Назад Оглавление Вперёд
Apache-модуль Вверх Безопасность БД