Новые книги

Книга известных профессионалов в области разработки коммерческих приложений в Linux представляет собой отличный справочник для широкого круга программистов в Linux, а также тех разработчиков на языке С, которые перешли в среду Linux из других операционных систем. Подробно рассматриваются концепции, лежащие в основе процесса создания системных приложений, а также разнообразные доступные инструменты и библиотеки. Среди рассматриваемых в книге вопросов можно выделить анализ особенностей применения лицензий GNU, использование свободно распространяемых компиляторов и библиотек, системное программирование для Linux, а также написание и отладка собственных переносимых библиотек. Изобилие хорошо документированных примеров кода помогает лучше усвоить особенности программирования в Linux.

Книга рассчитана на разработчиков разной квалификации, а также может быть полезна для студентов и преподавателей соответствующих специальностей.
Книга "Фундаментальные алгоритмы и структуры данных в Delphi" представляет собой уникальное учебное и справочное пособие по наиболее распространенным алгоритмам манипулирования данными, которые зарекомендовали себя как надежные и проверенные многими поколениями программистов. По данным журнала "Delphi Informant" за 2002 год, эта книга была признана сообществом разработчиков прикладных приложений на Delphi как «самая лучшая книга по практическому применению всех версий Delphi».

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

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

Безопасный Режим/Safe Mode

Учебник РНР
Назад Вперёд

Глава 23. Безопасный режим/Safe Mode

Содержание
Функции, ограниченные/отключённые режимом safe mode.

Безопасный режим PHP это попытка разрешения проблемы безопасности совместно используемого сервера. Архитектурно некорректно пытаться решить эту проблему на уровне PHP, но, поскольку альтернативы уровня web-сервера и ОС не слишком реалистичны, многие, особенно ISP, используют safe mode.

Таблица 23-1. Директивы конфигурации, управляющие режимом safe mode
ДирективаЗначение по умолчанию
safe_mode Off
safe_mode_gid 0
safe_mode_include_dir ""
safe_mode_exec_dir 1
open_basedir ""
safe_mode_allowed_env_varsPHP_
safe_mode_protected_env_varsLD_LIBRARY_PATH
disable_functions""

Когда safe_mode включён/on, PHP проверяет, совпадает ли owner/владелец текущего скрипта с owner файла, которым оперирует функция работы с файлами. Например:

-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php 
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd

Запуск на выполнение этого script.php

<?php
 readfile('/etc/passwd'); 
?>

приводит к такой ошибке, если safe mode активен:

Warning!: SAFE MODE Restriction in effect. The script whose uid is 500 is not 
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

Однако может быть такое окружение, когда строгая проверка UID не подходит, а достаточно менее строгой проверки GID. Это поддерживается посредством переключателя safe_mode_gid. Установка его в On выполняет проверку GID, а установка Off (по умолчанию) выполняет проверку UID.

Если вместо safe_mode вы установите директорию open_basedir, то все операции с файлами будут проводиться только с файлами в пределах этой директории. Например (пример Apache httpd.conf):

<Directory /docroot>
  php_admin_value open_basedir /docroot 
</Directory>

Если вы запустите тот же самый скрипт script.php с установкой open_basedir, то результат будет таким:

Warning!: open_basedir restriction in effect. File is in wrong directory in 
/docroot/script.php on line 2

Вы можете также отключить отдельные функции. Обратите внимание, что директива disable_functions не может использоваться вне файла php.ini, то есть вы не можете отключать функции на уровне директории или на уровне виртуального хоста в вашем файле httpd.conf.
Если добавить в файл php.ini:

disable_functions readfile,system

то мы получим на выводе:

Warning!: readfile() has been disabled for security reasons in 
/docroot/script.php on line 2

Функции, ограниченные/отключённые режимом safe mode

Это, скорее всего, неполный и, возможно, не вполне корректный листинг функций, ограниченных режимом safe mode.

Таблица 23-2. Функции, ограниченные безопасным режимом/Safe mode
ФункцияОграничения
dbmopen()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
dbase_open() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
filepro() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
filepro_rowcount() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
filepro_retrieve() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
ifx_*()ограничения sql_safe_mode, (!= safe mode)
ingres_*()ограничения sql_safe_mode, (!= safe mode)
mysql_*()ограничения sql_safe_mode, (!= safe mode)
pg_loimport()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
posix_mkfifo()Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт.
putenv() Подчиняется ini-директивам safe_mode_protected_env_vars и safe_mode_allowed_env_vars. См. также документацию putenv().
move_uploaded_file() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
chdir() Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт.
dl()Эта функция отключена в режиме safe mode.
Операция backtickЭта функция отключена в режиме safe mode.
shell_exec() (функциональный эквивалент backtick'ов) Эта функция отключена в режиме safe mode.
exec()Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу.
system()Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу.
passthru() Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу.
popen() Вы можете выполнять исполняемые файлы только внутри safe_mode_exec_dir. Из практических соображений вам в настоящее время не разрешается иметь компоненты .. в пути к исполняемому файлу.
mkdir() Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт.
rmdir() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
rename() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт.
unlink()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт.
copy()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (on source and target )
chgrp()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
chown() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт.
chmod() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Кроме того, вы не можете установить SUID, SGID и sticky-биты.
touch()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт.
symlink()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: проверяется только target/цель)
link()Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: проверяется только target/цель)
getallheaders() В безопасном режиме header'ы, начинающиеся с 'authorization' (нечувствительно к регистру), не будут возвращаться. Предупреждение: это нарушено реализацией aol-сервером функции getallheaders() !
header() В безопасном режиме uid скрипта добавляется в часть realm шапки WWW-Authenticate, если вы устанавливаете эту шапку/header (используемую для HTTP Authentication).
highlight_file(), show_source() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: работает, только начиная с PHP 4.2.1)
parse_ini_file() Проверяет, имеют ли файл(ы)/директории, с которыми вы работаете, тот же самый UID, что и исполняемый скрипт. Проверяет, имеет ли директория, в которой вы работаете, тот же самый UID, что и исполняемый скрипт. (Примечание: работает, только начиная с PHP 4.2.1)
Любая функция, использующая php4/main/fopen_wrappers.c??

Назад Оглавление Вперёд
Постоянные соединения с БД ВверхИспользование РНР
из командной строки