В предыдущей статье цикла мы начали рассматривать системные переменные или директивы РНР, которые устанавливаются через файл php.ini и позволяют тонко настроить среду исполнения РНР. Сейчас мы продолжим знакомство с наиболее важными директивами – знание и понимание механизма их действия позволят вам полностью управлять работой РНР, построить более защищенную веб-ситему или повысить производительность своего приложения.
Мы будем рассматривать конфигурацию РНР версии 5.0.х, так что, если у вас более раняя версия, некоторые директивы могут отсутствовать.
display_startup_errors = [Off/On] – управляет отображением сообщений про ошибки на этапе инициализации и запуска РНР-интерпретатора. Присоединяясь к рекомендации разработчиков, рекомендуем отключать эту опцию в реальных системах.
Естественно, что опция может устанавливаться только в файле php.ini – то есть до запуска самого ядра РНР.
log_errors = [Off/On] – позволяет включить запись всех ошибочных сообщений в лог-файл. Последующие директивы конкретизируют особенности работы механизма лога, например путь к файлу, размер лог-файла и другие параметры. Если вы разрабатываете серьезное приложение, особенно в первый период реальной работы, ведение лога и его регулярный просмотр могут стать отличным источником сообщений про недоработки, в то же время пользователям (и, возможно, взломщикам) не будет раскрываться какая-либо информация о внутренней архитектуре приложения.
error_log = [none/путь к лог-файлу] – задает путь к лог-файлу, в который будут записываться сообщения про ошибки и другая отладочная информация. Файл должен располагаться на сервере (не на удаленном компьютере) и быть доступным для записи.
arg_separator.output = ["&"/"другой символ или набор"] – позволяет задать набор символов-разделителей, которые используются в кодировке НТТР-запросов. К примеру, стандартно разделителем переменных является символ амперсанда (&). Можно задать набор из нескольких разделителей, при этом РНР рассматривает каждый из них как вероятный разделитель – если не удалось использовать первый заданный символ, РНР попробует другие. Разделители задаются в виде их кодов.
arg_separator.input = [";&"/"другой символ или набор"] – аналогично предыдущей опции указывает на символ-разграничитель полей при генерации ссылок средствами РНР.
variables_order = ["EGPCS"] – указывает РНР, где и в каком порядке искать переменные. Буквы обозначают место, где РНР ищет соответствующую переменную – E (переменные окружения), G (содержимое GET-запроса), Р (содержимое POST-запроса), С (переменные Cookie) и S (системные переменные). Поиск происходит в порядке слева направо и в таком же приоритете. То есть при налии переменных с одинаковыми именами РНР возьмет ту, которая встретится первой, – в данном случае переменная окружения (E) будет иметь более высокий приоритет, чем переменная, переданная в HTTP-запросе.
register_globals = [On/Off] – разрешает автоматически представлять все переменные, переданные в HTTP-запросе GET/POST, как обычные глобальные переменные, для обращения к которым не требуется явно указывать, к примеру $HTTP_POST_VARS[] или $_REQUEST[]. В принципе это существенно облегчает программирование, но многие авторы рекомендуют по соображениям безопасности отключать эту директиву и самостоятельно проводить обработку всех данных, поступающих в программу.
post_max_size = [8M/любое целое число M/K] – задает максимальный размер данных, передаваемых через POST-запрос. Эту директиву можно установить только через файлы php.ini и httpd.conf.
magic_quotes_gpc = [On/Off] – активизирует автоматическую обработку символов кавычек. Поскольку эти символы используются в качестве одной из конструкций языка и являются служебными, то РНР может автоматически замещать их на специальную последовательность \' для безопасной обработки. Эта директива применяется для обработки пользовательских данных, полученных через GET/POST/Cookie.
magic_quotes_runtime = [Off/On] – аналогична предыдущей директиве, с тем отличием, что ее действие распространяется на переменные, полученные в результате работы скрипта, например данные от базы данных. По умолчанию директива отключена, и программист должен сам обрабатывать свои данные.
default_mimetype = ["text/html"/допустимый MIME-type] – по умолчанию РНР-скрипт отдает пользователю информацию в виде обычного текста (соответствующий MIME-тип этих данных – text/html). Но если вы пишете специфическую программу, то может потребоваться изменить это значение на нужный вам тип данных. Или, если необходимо указать, что скрипт вернет другие данные, к примеру поток двоичных данных или аудиопоток, эту переменную можно изменить через функцию ini_set().
default_charset = ["iso-8859-1"/допустимая кодировка] – изначально эта директива отключена. Через нее задается кодировка, в которой РНР-скрипт отсылает данные пользователю.
file_uploads = [On/Off] – разрешает принимать файлы от пользователей, переданные через HTML-формы.
upload_tmp_dir =[none/путь к директории] – если прием файлов разрешен, то РНР автоматически обрабатывает их и сохраняет во временной директории. Если директива upload_tmp_dir не задана (а изначально она отключена), то РНР использует системную временную директорию для хранения загружаемых файлов. В скрипте необходимо вручную обрабатывать такие файлы, к примеру через функцию move_uploaded_file().
upload_max_filesize = [2M/целое число M/K] – задает максимальный размер файла, который разрешается передать в скрипт. Кстати, поскольку файл передается в теле POST-запроса, то на его размер влияет и другая директива, post_max_size, поэтому желательно, чтобы допустимый размер файла был меньше общего размера POST-данных. Например, если вы хотите разрешить загрузку нескольких файлов одновременно, то необходимо, чтобы суммарный их обьем был меньше, чем post_max_size, а размер каждого в отдельности не превышал upload_max_filesize.
allow_url_fopen = [On/Off] – разрешает применять обычные функции для работы с файлами при взаимодействии с удаленными узлами. Это позволяет получить тело страницы, просто открыв ее как обычный файл, указав вместо пути полный URL-адрес. Хотя, если честно, предпочтительней использовать для этого соединение через сокеты – у вас будет больше контроля и возможностей при работе с удаленными узлами. Есть еще две директивы, по умолчанию отключенные, from и user_agent, которые задают параметры для доступа (поле from может содержать e-mail пользователя), а через user_agent можно «замаскироваться» под браузер или же честно указать, что это РНР-скрипт (user_agent = «PHP»).
default_socket_timeout = [60/целое число] – задает время ожидания данных из сокета до разрыва соединения.
include_path = [".;/usr/local/php5/PEAR"] – содержит набор путей для поиска модулей и классов РНР. Если вы используете расширение РЕАR, то укажите путь к каталогу через точку с запятой. Первым по умолчанию указан текущий каталог скрипта. Директива может устанавливаться и программно, но желательно сначала получить ее текущее значение – функция ini_get('include_path') – и просто добавить нужный каталог в список через вызов ini_set().
extension_dir = ["/usr/local/php5/ext"] – задает путь до каталога с модулями расширения. В старых версиях РНР этот каталог носил название extensions, в новых он сократился до простого ext, хотя вы можете располагать модули в любом каталоге. В РНР для платформы win32 расширения – это обычные библиотеки DLL, для платформ Linux/Unix – файлы с расширением *.so.
enable_dl = [On/Off] – разрешает загрузку и использование динамических модулей.
extension = [php_curl.dll/файл модуля] – этой директивой указывается, какой модуль РНР может загружать. Это единственная из всех директив, которая может использоваться несколько раз. При каждом вызове она должна содержать имя файла (вместе с расширением), который содержит необходимый модуль. Обратите внимание, что задаются только имена файлов, а директория, где РНР ищет их, определяется директивой extension_dir. Традиционно все модули имеют название, состоящее из префикса php_ и названия модуля. Например, имя модуля mcrypt, который позволяет использовать функции криптографии в скриптах, будет иметь вид php_mcrypt.dll (на win32) или php_mcrypt.so (на Linux/Unix).
Для загрузки одновременно нескольких модулей просто укажите загрузку каждого модуля в отдельной строке:
extension=php_gd2.dll
;extension=php_mbstring.dll
extension=php_mcrypt.dll
В этом примере сначала загружается модуль GD (библиотека для работы с графикой), потом РНР определяет, что директива загрузки модуля mbsring закомментирована (отключена), и переходит к загрузке следующего модуля – mcrypt.
РНР начинает работу с модулями еще на этапе инициализации, проверяя доступность всех подлежащих загрузке файлов, поэтому все директивы, относящиеся к модулям, могут быть установлены только через файлы http.conf и php.ini. Если какой-либо модуль не найден, то РНР сгенерирует ошибку, но продолжит работу, так как модули не влияют на основную функциональность. Рекомендуется без необходимости не подключать лишние расширения – в некоторых случаях это может лишь замедлить работу и повлиять на общую безопасноть сервера.
И в заключение еще несколько директив, связанных с безопасностью.
expose_php = [On/Off] – со стороны может показатся, что это невинная опция, разрешающая РНР выводить информацию о своей версии в строке HTTP-ответа сервера. Разработчики советовали оставлять ее включенной, так как это может способствовать распространению РНР, ведь на основе анализа ответов серверов собирается, к примеру, мировая статистика использования РНР. Но в то же время это дает бесценную информацию для потенциального взломщика – ведь, имея точную информацию о версии и номере ПО, установленном на сервере, гораздо легче подобрать метод взлома. Поэтому можно рекомендовать отключать эту директиву на рабочих серверах, особенно если вы используете серьезные приложения на стороне сервера.
doc_root = [none/путь к каталогу] – может задавать каталог, в котором размещаются PHP-скрипты. Эта директива разрешает исполнение скриптов только в указанном каталоге и его поддиректориях, запрещая исполнение всех других сценариев. Если вы строите максимально защищенную веб-систему, то вам очень пригодится использование возможностей этой директивы. По умолчанию она отключена.
Вот мы и рассмотрели некоторые основные директивы из общей секции файла конфигурации php.ini. Некоторые модули используют свои собственнеы секции для хранения конфигурации, и мы рассмотрим их в следующих статьях.
Ссылки по теме
- PHP official site
- PHP Manual: Runtime Configuration
- PHP: секреты файла php.ini. Часть 1
- PHP: секреты файла php.ini. Часть 3
Статья получена: hostinfo.ru