Супермассив $_SERVER в PHP

Для обработки информации, связанной с работой веб-сервера или отправляемой пользователем в PHPпредусмотрены суперпеременные, обращаться к которым следует так же, как к массивам. В их числе содержатся $_GET и $_POST, обеспечивающие обработку получаемых данных через GET- и POST-запросы соответственно.

Количество входящих в них элементов зависит от конкретных запросов, в то время как у $_SERVER, с помощью которого, к примеру, можно узнать User-Agent, число пар «наименование значение» превышает несколько десятков.

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

Описание супермассива <? $_SERVER[‘ELEMENT’] ?>

$_SERVER был введён в четвёртой версии, значительно переработан в спецификации 4.1.0 и продолжающий поддерживаться, дополняясь новыми индексами, в современных версиях. Как и в момент своего появления, сейчас данная особенность языка используется в совершенно разнообразных сценариях: от простого вывода информации вида «мы знаем ваш User-Agent» до задач, связанных с безопасностью не только посетителей, но и самого веб-сайта.

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

Для получения данных, выдаваемых определённым индексом, следует вывести их, как в случае с простыми массивами. Пример:

<?echo $_SERVER[‘DOCUMENT_ROOT’]; ?>.

При использовании этой функции, которая может быть сокращена до <?=$_SERVER[‘DOCUMENT_ROOT’]; ?>,выведется абсолютный путь к видимому посетителями «корню сайта» – директории public_html, зачастую представленной ярлыком к каталогу private_html.

Обзор элементов

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

PHP_SELF

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

Если задействовать вызов PHP_SELF вместе с волшебной константой __FILE__, результат окажется идентичным итогу вышерассмотренного решения, предполагающего задействование двух индексов. Разница во времени при задействовании этого или предыдущего варианта несущественна, однако при желании максимально оптимизировать код подойдёт данный способ.

argv

При задействовании $_SERVER[‘argv’], как и в случае с $argv, можно получить список аргументов, с которыми работает заданный скрипт. Если указать функцию либо обратиться к супермассиву в консоли, откроется список параметров командной строки, схожий с тем, что предлагается в языке Си.

argc

Работает похожим образом с $argv, но вместо массива выдаёт количество используемых параметров, позволяя не задействовать функцию count(); и, тем самым, давая экономить время при интерпретации.

GATEWAY_INTERFACE

Служит для получения информации о спецификации CGI, поддерживаемой сервером. Крайне полезна для добавления в качестве условий к if-elseif-else перед скриптами, требовательными к данному параметру.

SERVER_ADDR

Выводит IP сервера, исполняющего программу, но не адрес пользователя. С точки зрения безопасности проверка с использованием этого индекса обеспечивает низкую, но всё же заслуживающую внимания защиту от копирования кода злоумышленниками.

Если планируется добавить условие, что программа работает при совпадении реального IP с указанным, советуется вывести проверяемое значение в глобальную переменную, чтобы на случай «переезда» на другой хостинг не редактировать каждый файл отдельно, теряя время работоспособности сайта вдобавок к издержкам, вызванным редактированием DNS-записей и переносом конфигураций.

SERVER_NAME

Выдаёт имя хоста, где выполняется скрипт. Если сайт работает на виртуальной машине, будет выведено её название, а не наименование выделенного сервера. Заметка для пользователей Apache 2 проявляется в необходимости установить требование использования «каноничного» имени в настройках софта. Если этого не сделать, значение может быть подменено клиентом, что вызовет проблемы в вопросах безопасности.

SERVER_SOFTWARE

Название и версия приложения, на котором работает сайт. Среди распространённых решений, совместимых с PHP, присутствуют Apache, nginx, XAMPP и подобные разработки, пригодные для любых целей – по статистике от Wappalyzer они задействуются везде: от личных блогов до крупнейших компаний.

Во избежание атак советуется скрывать значение данного параметра от пользователей или даже подделывать. К примеру, если где-то указать, что сайт работает на nginx, это позволит защитить ресурс на Apache, так как хакеры будут пытаться применять несовместимые на уровне кода данной программы методы взлома.

Дополнительно советуется ограничить выдачу информации, выдаваемую на, к примеру, стандартных страницах HTTP-ошибок. Параметр устанавливается в конфигурации сервера в Apache — это файл .htaccess.

REQUEST_METHOD

Показывает, какой метод был использован для получения доступа к странице. Один из самых часто используемых элементов, представленных в этой статье. В основном $_SERVER[‘REQUEST_METHOD’] задействуется в обработчиках форм, выведенных в отдельные файлы.

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

Если доступ к скрипту получен через HTTPHEAD, обработка программы завершится после отправки заголовков. В ответе функция выдаёт имя метода, написанное большими буквами:

  • GET,
  • POST,
  • OPTIONS и подобные.

REQUEST_TIME

Через $_SERVER[‘REQUEST_TIME’] можно получить временную метку, показывающую, когда сервер начал обработку HTTP-запроса, отправленного пользователем. Один из вариантов задействования данного индекса представлен анализированием скорости работы скрипта и сервера в целом. Преимущество перед microtime(); заключается в том, что элемент массива проверяет не только скорость работы программы, но и время ответа сайта.

REQUEST_TIME_FLOAT

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

QUERY_STRING

Отображает данные, переданные после вопросительного знака в адресной строке. Информация, передаваемая в GET, имеет ограниченную длину – до 2048 символов. Из-за сохранения параметров, отправленных этим методом, в истории браузера и возможной передачи разработчикам приложений списка часто посещаемых ресурсов, способ не рекомендован для отправки конфиденциальной информации, к которой относятся пароли и логины, платёжные реквизиты.

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

DOCUMENT_ROOT

Указывает абсолютный путь к корневой директории сайта, видимой посетителям и используемой на front-side. Корректная работа ресурса обеспечивается при совпадении значения $_SERVER[‘DOCUMENT_ROOT’] тому, что указано в настройках сервера.

HTTP_ACCEPT

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

HTTP_ACCEPT_CHARSET

Возвращает содержимое заголовка Accept-Charset, показывающего принимаемые кодировки. Их может быть несколько, поэтому для переключения данного показателя советуется задействовать условия, завязанные на результатах выполнения strpos(); или strstr();.

HTTP_ACCEPT_ENCODING

Среди начинающих программистов данный параметр часто путается с упомянутым выше. $_SERVER [‘HTTP_ACCEPT_ENCODING’] отвечает за обработку отправляемого клиентом HTTP-заголовка Accept-Encoding, показывающего доступные способы сжатия информации для ускоренной загрузки страниц.

HTTP_ACCEPT_LANGUAGE

Параметр направляется пользовательским браузером при открытии страницы и содержит несколько языков с различными коэффициентами, показывающими, сколько процентов составляет вероятность отдачи пользователем предпочтения в пользу указанной локализации. Значения вычисляются клиентским программным обеспечением исходя из собственных параметров и настроек системы, анализа посещаемых ресурсов (если разрешено).

HTTP_CONNECTION

Тип соединения, предпочитаемый пользователем. Считывается из заголовка Connection. Наиболее распространённый вариант: keep-alive.

Защита, построенная на HTTP_CONNECTION, обезопасит от злоупотребления доступом к какой-либо программе или, проще говоря, исключает флуд-запросы, при взаимодействии вместе с проверками по другим.

HTTP_HOST

Показывает данные, поступившие с заголовком Host.

HTTP_REFERER

Выводит сайт-источник, откуда пришёл пользователь. Существуют аддоны, удаляющие его, а в некоторых браузерах предусмотрен встроенный функционал подмены значения REFERER, ввиду чего не стоит устанавливать какие-то важные результаты проверок, основывающихся на $_SERVER[‘HTTP_REFERER’].
Обезопасить сервер от массовых запросов, поступающих с определённого адреса и известных по REFERER, можно, однако защита такого рода окажется неэффективной по вышеуказанной причине, даже если установить её на уровне файла настроек по типу .htaccess.

HTTP_USER_AGENT

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

  • определение, является ли девайс мобильным;
  • понимание версии ПО для вывода предупреждений на случай, если какие-либо приложения устарели,
  • определения ссылок на загрузку определённого содержимого для повышения «userexperience».

Более практичным вариантом понять, использует ли пользователь смартфон, планшет, или предпочитает стационарные устройства, является определение ориентации экрана и его разрешения, возможного не только средствами JavaScript, но и CSS, не считающегося языком программирования, а служащего для придачи оформления.

HTTPS

Отображает, было ли соединение установлено по защищённому от отслеживания владельцами сетей протоколу HTTPS, или задействовался HTTP.

REMOTE_ADDR

Возвращает пользовательский IP-адрес. Получить данные по типу провайдера, которому он подконтролен, или приблизительной геолокации, с помощью встроенных средств нельзя, однако есть решения в виде собственных баз либо предлагаемых сообществом сайтов. Одним из лучших среди бесплатных сервисов является geoplugin.com, предоставляющий данные в виде PHP, JSON и прочих видов массивов.

REQUEST_URI

Отдаёт доступный для использования на client-sideадрес страницы, где находится посетитель, относительно корневого каталога. Присутствуют и другие индексы, более подробный список представлен на официальном портале.

HTTP-авторизация

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

Отправленная информация хранится в следующих индексах:

  • PHP_AUTH_DIGEST– флаг, показывающий, защищена ли данная страница. Если значение равно «Authorization», активируется дальнейший функционал по проверке вводимой клиентом пары «логин:пароль»;
  • PHP_AUTH_USER– указанный в окне логин;
  • PHP_AUTH_PW– предоставленный пароль;
  • AUTH_TYPE– вид авторизации, распространёнными значениями являются Digest и Basic.

Поддерживается шифрование, в том числе с помощью SHA-1, повышающее сохранность пользовательских данных. Файл с конфиденциальной информацией советуется заблокировать от простых посетителей с помощью .htaccess или иных методов, в том числе через проверку по defined();.

Примеры использования

Получение абсолютного пути к файлу

<?echo $_SERVER[‘DOCUMENT_ROOT’].$_SERVER[‘PHP_SELF’]; ?>

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

Вывод всей информации

<?var_dump($_SERVER); ?>

Все доступные для получения данные, хранящиеся в суперпеременной, могут быть получены функцией var_dump();. Часть предоставляемой таким образом информации не следует никогда передавать пользователям, поскольку это повышает степень уязвимости веб-сервера. Содержимого достаточно для отладки и должно выводиться только администраторам ресурса.

Заключение

ВPHP внедрены мощные инструменты, расширяющие сферу использования языка. Рассмотренный $_SERVER составляет лишь часть от предопределённых переменных, повышающих интерес к изучению программирования.

2 комментария для “Супермассив $_SERVER в PHP

  • 28.04.2021 в 06:33
    Постоянная ссылка

    Век живи, век учись… даже не знал, что в пхп может быть понятие супермассив)))

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *