Глобальные переменные в PHP

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


В данной статье мы как раз и займемся изучением того, что собой представляет глобальная переменная и как она работает.

Глобальная переменная: область видимости

Контекст, в рамках которого определяется переменная, называют областью видимости. Как правило, переменные имеют только одну область видимости. Когда глобальные переменные в PHP подгружаются из других файлов, то они могут быть требуемыми (require) и включаемыми (include). Они по умолчанию ограничены локальной областью видимости функции. Как же сделать так, чтобы переменную видели файлы за ее границами и к тому же могли ее использовать? Именно для этого в PHP и предусмотрена глобальная переменная. Здесь ключевым словом является именно «global». Как же объявить глобальную переменную в языке PHP? Чтобы достичь этой цели, необходимо использовать слово «global». Его нужно размещать непосредственно перед той переменной, которую вы хотите сделать глобальной. Выглядит это примерно следующим образом: global «Переменная». После осуществления указания такого рода работать с данными сможет совершенно любой файл.

Если где-то будут ссылки на данную переменную, то программа будет обращать внимание на глобальную версию. Почему используется такая странная формулировка? Все дело в том, что одновременно с этим также могут существовать и локальные версии. Но они будут более доступными исключительно в тех файлах, в которых они объявлены. Для остальных будут действовать глобальные переменные класса PHP. Здесь нужно действовать очень внимательно и осторожно. Чтобы предотвратить всякие сомнения, приведем простой пример, как они могут выглядеть: global a. Если один файл будет иметь доступ к нескольким переменным, это может вызвать конфликт. Но сказать точно здесь нельзя, глобальная или локальная переменная будет считываться, или все-таки произойдет ошибка. Если прописать ее внутри функции, никаких проблем возникнуть не должно. Использование переменной за границами функции будет проблематично. Поэтому нужно очень внимательно следить за структурой составления кода и убедиться, что нигде нет никаких предпосылок возникновения конфликта.

Глобальные переменные: другой вариант записи
Существуют ли другие способы задания глобальных переменных? Да, и не один. Рассмотрим для начала $GLOBALS. Он представляет собой ассоциативный массив, в которым ключом является имя. В качестве значения используется содержимое глобальной переменной. Стоит отметить, что после объявления данный массив существует в любой области видимости. Это дает основание считать его суперглобальным. Выглядит это следующим образом: $GLOBALS [‘Переменная’].

Суперглобальные переменные
В любом языке программирования существуют имена, которые зарезервированы под отдельные функции. Создать в PHP одноименные глобальные переменные просто не получится. В данном языке программирования существуют свои особенности. Так, например, особенно важным является то факт, что у предопределенных переменных здесь нет приставки «супер». Это значит, что доступны они не во всех местах. Как можно исправить данную ситуацию? Чтобы сделать предопределенную переменную доступной в какой-то локальной сети, необходимо объявить ее следующим образом: global «переменная». Ранее об этом уже вроде говорилось. Однако все не совсем так. Рассмотрим реальный пример:
Global $HTTP_POST_VARS; echo $HTTP_POST_VARS [‘name’].
Ощущаете разницу? Стоит иметь ввиду, что в языке PHP глобальная переменная обязательно должна использоваться в рамках функции. Она также может располагаться в файле, который включается в нее.

Безопасность и ссылки
Как вы сами можете убедиться, создать глобальную переменную в языке PHP это не проблема. Но существуют ли какие-либо особенности, касающиеся ссылок? При использовании глобальных переменных возможно довольно неожиданное поведение. Но прежде чем более детально изучить данный вопрос, необходимо обратиться к предыстории. По умолчанию в версии 4.2 директива register_globals была изменена с включенного состояния на выключенное. Для многих пользователей это совершенно неважно, и напрасно, ведь от этого напрямую зависит безопасность разрабатываемого продукта. Если вам нужно сделать глобальную переменную, то директива PHP непосредственно не окажет влияния на этот параметр. Однако некорректное использование может стать угрозой безопасности. Так, например, если register_globals будет находиться во включенном состоянии, то перед исполнением кода будут инициализироваться различные необходимые переменные. Поэтому ее решили отключить. Почему глобальная переменная многим обязана состоянием данной директивы? Проблема в том, что при включенном состоянии разработчикам не всегда удавалось ответить на вопрос, откуда она взялась, но с другой стороны, это существенно облегчало процесс написания кода. При этом такая организация создавала определенную угрозу для безопасности. Чтобы избежать перемешивания данных и появления ошибок, директива была отключена. Теперь давайте рассмотрим пример небезопасного кода. Также мы разберемся, как можно обнаружить случаи, когда объявление глобальной переменной PHP сопровождается попыткой подмена информации. Это требуется для того, чтобы создавать стабильно работающие сайты, которые не сможет взломать первый попавшийся пользователь.

Опасные коды
Установим, что переменная истинна для тех пользователей, которые прошли авторизацию:
If (authenticate_user()) {$authoriza=true;} if ($authorize) { include “/highly/sensitive/data.php”;}. Переменная в данном состоянии может устанавливаться автоматически. Если учитывать, что данные просто могут быть заменены, а источник их происхождения не устанавливается, то фактически любой пользователь может пройти такую проверку и выдать себя за кого угодно. Злоумышленник при желании может нарушить логику работы всего скрипта. Если изменить значение директивы, код будет работать корректно. Именно это нам и требуется сделать. Однако инициализация переменных является не только правилом хорошего тона среди программистов, она также гарантирует стабильность работы скрипта.

Надежный вариант
Для достижения поставленной цели можно попробовать выключить работу директивы, или написать более сложный код, например, такой: if (isset($_SESSION [‘username’])) {echo «Привет» {$_SESSION [‘username’]}”;} else {echo “Привет Guest”; echo “Приветствую!”;}. В этом случае будет сложно сделать подмену. Однако, это возможно. Для этого нужно заранее позаботиться о наличии инструментов оперативного реагирования. В том случае, если в PHP требуется включить глобальные переменные, то можно использовать следующий инструмент: если вы точно знаете, в каком диапазоне будет получено значение, то можно прописать это таким образом, чтобы скрипт проверял этот факт путем сопоставления. Это конечно, тоже не может гарантировать 100%-ую защиту от подмены значений. Однако перебор возможных вариантов значительно усложнит операцию.

Как обнаружить попытку подмены?
Теперь давайте проверим, правильно ли вы поняли все ранее написанное. Глобальные переменные в функции вам нужно будет объявить самостоятельно. Это такое своеобразное домашнее задание. Сначала приведем код:

Приведем некоторые пояснения. Переменная C_COOKIE берется из достоверного источника. Чтобы убедиться в том, что ее результат соответствует ожидаемому, значение переменной проверяется. В случае возникновения проблем, администратору приходит уведомление. Если ничего не произошло, никаких действий совершено не будет.

Отблагодари меня, поделись ссылкой с друзьями в социальных сетях:


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

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