Безопасный режим/Safe Mode
- Содержание
- Функции,
ограниченные/отключённые режимом safe mode.
Безопасный режим PHP
это попытка разрешения проблемы безопасности совместно используемого сервера.
Архитектурно некорректно пытаться решить эту проблему на уровне PHP, но, поскольку
альтернативы уровня web-сервера и ОС не слишком реалистичны, многие, особенно
ISP, используют safe mode. Национальный
театр в Лондоне
Данные, отправляемые пользователем
Самые большие
дыры во многих PHP-программах зависят не столько от самого языка, сколько от кода,
написанного без учёта обеспечения безопасности. Соответственно, вы всегда должны
выделять время для исследования влияний на данный участок кода, чтобы знать о
возможном вреде, который может нанести отправка в него переменной с нестандартным
значением. Различные формы многопрограммных
(мультипрограммных) режимов
Пример 4-17. Опасное использование переменных
<?php // удалить файл из домашней директории пользователя ...
а может - // ещё что-нибудь? unlink ($evil_var); // записать логинг доступа ...
или, может быть, вхождение /etc/passwd? fputs ($fp, $evil_var); // выполнить что-нибудь
тривиальное ... или rm -rf *? system ($evil_var); exec ($evil_var); ?> |
|
Вы всегда должны тщательно проверять ваш код, чтобы
гарантировать, что любые переменные, отправляемые из web-браузера, соответствующим
образом будут проверены, и задайте себе следующие вопросы:
-
Будет
ли данный скрипт воздействовать только на предполагаемые файлы?
-
Могут
ли быть обработаны необычные или нежелательные данные?
-
Может ли
данный скрипт быть использован несоответствующим образом? Теоретическая механика
Шарнирно-неподвижная опора Опора
допускает поворот вокруг шарнира и может быть заменена двумя составляющими силы
вдоль осей координат.
-
Может ли он быть использован в сочетании
с другими скриптами негативным образом?
-
Будет ли выполнен адекватный
логинг для каждой транзакции? Страны
Дальнего Востока Огромный регион, условно называемый Дальним Востоком, включает
в себя Китай, Японию, Корею, Монголию и Тибет — страны, имеющие ряд сходных черт,
но одновременно и значительные различия в культуре. Все страны Дальнего Востока
испытывали воздействие древних цивилизаций Китая и Индии, где ещё в I тысячелетии
до н. э. возникли философско-религиозные учения, положившие начало представлению
о природе как всеобъемлющем Космосе — живом и одухотворённом организме, который
живёт по своим собственным законам.
Задав себе эти вопросы при написании
скрипта, а не потом, вы предотвратите возможную переделку для повышения защищённости.
Начав таким образом, вы не гарантируете полную безопасность вашей системы, но
сможете значительно повысить её. Возможно, вы захотите также предусмотреть
отключение register_globals, magic_quotes или других установок, которые могут
создать у вас неуверенность в проверке, источнике или значении данной переменной.
Работа с PHP в режиме error_reporting(E_ALL) также может помочь, предупреждая
вас о переменных, используемых до проверки или инициализации (что предотвратит
операции с необычными данными).
U
uasort
ucfirst ucwords udm_add_search_limit
udm_alloc_agent udm_api_version
udm_cat_list udm_cat_path
udm_check_charset udm_check_stored
udm_clear_search_limits udm_close_stored
udm_crc32 udm_errno
udm_error udm_find
udm_free_agent udm_free_ispell_data
udm_free_res udm_get_doc_count
udm_get_res_field udm_get_res_param
udm_load_ispell_data udm_open_stored
udm_set_agent_param uksort
umask uniqid unixtojd
unlink unpack unregister_tick_function
unserialize unset
urldecode urlencode
user_error usleep
usort utf8_decode
utf8_encode Безопасность
PHP это
мощный язык и интерпретатор, подключён ли он к web-серверу как модуль или запускается
как отдельный двоичный CGI. Он способен выполнять доступ к файлам, исполнять команды
и открывать сетевые соединения на сервере. Эти свойства делают всё запускаемое
на web-сервере небезопасным по умолчанию. PHP разработан специально как более
безопасный язык для написания CGI-программ, чем языки Perl или C, с корректным
выбором опций конфигурации времени компиляции и времени выполнения, удобным кодированием,
что даёт вам сочетание свободы и необходимой защищённости.
Поскольку имеется
много способов использования PHP, имеются и множество опций конфигурации, управляющих
его поведением. Большое количество опций гарантирует, что вы можете использовать
PHP для различных целей, но это также означает, что имеются комбинации этих опций
и конфигураций серверов, которые дают незащищённую инсталяцию.
Гибкость
конфигурации PHP эквивалентна гибкости кода. PHP можно использовать для построения
законченных серверных приложений со всеми возможностями пользователя оболочки/shell,
или использовать его для простых серверных включений с минимальным риском в жёстко
контролируемой среде. То, как вы выстроите окружение и насколько безопасной оно
будет, в большой степени зависит от PHP-разработчика.
Эта глава начинается
с общего рассмотрения проблем обеспечения безопасности, различных комбинаций опций
конфигурации и ситуаций, когда они могут безопасно использоваться. Также даётся
описание кодирования для различных уровней безопасности.
Абсолютно безопасных
систем не существует, поэтому используется некий баланс риска и удобства использования.
Если каждая переменная, отправляемая пользователем, требует двух форм биометрической
проверки (такой как сканирование сетчатки глаза и отпечатки пальцев), вы получите
предельно высокий уровень безопасности. Заполнение очень сложной формы займёт
полчаса, что побудит пользователей находить способы обойти защиту.
Достаточный
уровень защиты обеспечивает соответствие требованиям безопасности без ухудшения
условий работы пользователя или излишнего усложнения работы автора-кодировщика.
Вместе с тем, некоторые атаки могут использовать этот стиль обеспечения защиты,
что приводит к её постепенному ослаблению.
Обычно плохо помнят фразу: надёжность
системы определяется её самым слабым звеном. Если все транзакции основательно
защищены на основе логинга по времени, размещению, типу транзакции etc., но пользователь
проверяется только по единственной куке, надёжность связки пользователя и log'а
транзакций будет серьёзно нарушена.
При выполнении тестирования помните,
что не сможете проверить все варианты, даже для простейшей страницы. Вывод, который
вы ожидаете, может совсем не соответствовать тому, что увидит недовольный служащий,
кракер с многолетним стажем или домашний кот, гуляющий по клавиатуре компьютера.
Поэтому лучше смотреть на код с учётом логической перспективы, чтобы разобраться,
где могут быть введены неожиданные данные; как его модифицировать, уменьшить или
расширить.
Internet заполнен людьми, пытающимися сделать себе имя на том,
что они разрушат ваш код, завалят ваш сайт, разместят на нём неподходящее содержимое,
и вообще желающими сделать вашу жизнь интересной. И неважно, маленький или большой
у вас сайт, вы всегда являетесь мишенью, находясь online и имея сервер, с которым
можно соединиться. Многие программы-кракеры невелики по размеру, они просто просматривают
массивы блоков IP, выискивая жертву. Не будьте одной из них.
var_dump var_export
variant version_compare virtual
vpopmail_add_alias_domain vpopmail_add_alias_domain_ex
vpopmail_add_domain vpopmail_add_domain_ex
vpopmail_add_user vpopmail_alias_add
vpopmail_alias_del vpopmail_alias_del_domain
vpopmail_alias_get Формула
Тейлора vpopmail_alias_get_all
vpopmail_auth_user vpopmail_del_domain
vpopmail_del_domain_ex vpopmail_del_user
vpopmail_error vpopmail_passwd
vpopmail_set_user_quota vprintf
vsprintf Сериализация объектов - объекты в
сессиях
Примечание: в PHP 3 объекты теряют ассоциацию
со своим классом в процессе сериализации и десериализации. Результирующая переменная
будет объектом типа, но не имеет класса и методов, и, таким образом, будет бесполезна
(она станет похожа на массив со странным синтаксисом).
| Внимание! |
| Следующая информация верна только для
PHP 4. |
serialize() возвращает строку, содержащую
представление в виде потока байтов любой переменной, которая может храниться в
PHP.
unserialize() может использовать эту строку для воссоздания оригинальных
значений переменной. Использование serialize для сохранения объекта сохранит все
переменные объекта. Функции объекта не сохраняются, только имя класса.
Чтобы
иметь возможность unserialize() объект, должен быть определён класс этого
объекта. То есть, если у вас имеется объект $a класса A в файле page1.php и вы
его сериализуете, вы получите строку, которая ссылается на класс A и содержит
все значения переменных, содержащихся в $a. Если вы хотите unserialize это в файле
page2.php, воссоздав $a класса A, определение класса A обязано иметься в page2.php.
Это можно сделать, например, сохранив определение класса A в include-файле и подключив
этот файл и в page1.php, и в page2.php.
classa.inc: class A { var $one = 1; function show_one() { echo
$this->one; } } page1.php: include("classa.inc"); $a = new A; $s = serialize($a);
// сохраняем $s там, где page2.php может его найти. $fp = fopen("store", "w");
fputs($fp, $s); fclose($fp); page2.php: // это необходимо для правильной работы
десериализации. include("classa.inc"); $s = implode("", @file("store")); $a =
unserialize($s); // теперь используем функцию show_one() объекта $a. $a->show_one(); |
Если вы используете сессии и session_register() для регистрации
объектов, эти объекты сериализуются автоматически в конце каждой PHP-страницы
и десериализуются автоматически на каждой последующей странице. Это означает,
что эти объекты могут появиться на любой странице, после того как стали частью
вашей сессии.
Настоятельно рекомендуем включать определение классов всех
таких зарегистрированных объектов во все ваши страницы, даже если вы и
не используете эти классы во всех ваших страницах. Если вы этого не сделаете
и объект десериализуется в отсутствие определения класса, он потеряет ассоциацию
с этим классом и станет объектом класса stdClass без всяких функций вообще,
то есть станет практически бесполезен.
Итак, если в вышеприведённом примере
$a стало частью сессии через запуск session_register("a"), вы должны
включить/include файл classa.inc во все ваши страницы, а не только в
page1.php и page2.php.
w32api_deftype
w32api_init_dtype w32api_invoke_function
w32api_register_function w32api_set_call_method
wddx_add_vars wddx_deserialize
wddx_packet_end wddx_packet_start
wddx_serialize_value wddx_serialize_vars
wordwrap Начальный/конечный тэги
Первое,
что вы, вероятно, заметили, это что в PHP изменились начальный и конечный тэги.
Старая форма <? > на три новые возможные варианта:
Пример C-1. Миграция: старые start/end тэги
<? echo "This is PHP/FI 2.0 code.\n"; ?> |
|
Как и в версии 2.0, PHP/FI также поддерживается
этот вариант:
Пример C-2. Миграция:
первый вариант новых start/end тэгов
<? echo "This is PHP 3.0 code!\n"; ?> | |
Обратите внимание, что конечный тэг состоит теперь из знака вопроса
и символа > вместо одного символа >. Однако, если вы планируете использовать
XML на вашем сервере, у вас появятся проблемы с первым новым вариантом, поскольку
PHP может попытаться выполнить XML-разметку в XML-документах как PHP-код. Из-за
этого был введён второй вариант:
Пример C-3. Миграция: второй вариант новых start/end тэгов
<?php echo "This is PHP 3.0 code!\n"; ?> |
|
У многих были проблемы с редакторами, которые вообще
не понимали тэги инструкций процессинга. Microsoft FrontPage - один из таких,
поэтому был введён также такой вариант:
Пример C-4. Миграция: Третий вариант новых start/end тэгов
<script language="php"> echo "This is PHP 3.0 code!\n";
</script> | |