PHP глобальная переменная в функции. Сделать переменную глобальной в PHP
Для создания полноценного сайта, который обладает широким функционалом необходимо знать о многом. Но то, что может придать ему настоящую уникальность – это PHP. Глобальная переменная в этом языке программирования используется не очень часто, но иногда знать, как она работает, бывает просто необходимо. Вот изучением того, чем она является и как работает, мы и займемся в данной статье.
Область видимости
По умолчанию они ограничены локальной областью видимости функции. А как сделать, чтобы переменную видели файлы за её границами, причем могли бы ещё и использовать? Для этого и предусмотрена в PHP глобальная переменна.
Ключевое слово "global"
После осуществления такого указания, работать с данными сможет любой файл. Если где-то имеются ссылки на эту переменную, то всегда программа будет обращать внимание именно на глобальную версию.
Почему такая странная формулировка? Дело в том, что одновременно с этим могут существовать и локальные версии. Но доступными они будут исключительно в тех файлах, где объявлены. А для всех остальных будут действовать глобальные переменные класса PHP. Поэтому необходимо быть осторожным. И чтобы не было сомнений, вот вам пример, как они выглядят: global a.
Поскольку, если один файл будет иметь доступ к нескольким переменным, это вызовет их конфликт. Но здесь нельзя точно сказать – локальная или глобальная переменная будет считываться, или же и вовсе возникнет ошибка. Так, если её прописать внутри функции, то проблем быть не должно. Но использование переменной за её границами будет проблематическим. Поэтому необходимо внимательно следить за структурой составления программного кода и убеждаться, что нигде нет даже предпосылок для того, чтобы возник упомянутый конфликт.
Другой вариант записи
Предопределённые/суперглобальные переменные
В каждом языке программирования есть какие-то имена, что зафрахтованы для его отдельных функций. Поэтому создавать в PHP глобальные переменные одноименными не получится.
В этом языке программирования имеются свои особенности. Так, важным является то, что предопределённые переменные здесь не имеют установки «супер», то есть они доступны не во всех местах. Как же это исправить? Чтобы предопределённая переменная была доступна в какой-то локальной области, её необходимо объявлять следующим образом: global «Переменная». Вроде бы то же, что и ранее рассказывалось, верно? Верно, да не совсем. Давайте рассмотрим уже «боевой» пример:
- global $HTTP_POST_VARS;
- echo $HTTP_POST_VARS['name'].
Чувствуете разницу между ними? Имейте ввиду, что в PHP глобальная переменна не обязательно должна быть использована в рамках функции. Она вообще может быть расположена в файле, который в неё включается.
Ссылки и безопасность
Как видите, в PHP создать глобальную переменную не проблема. А вот есть ли какие-то особенности относительно ссылок? Да, может быть неожиданное поведение при использовании global. Но перед этим небольшая предыстория.
В версии 4.2.0 директива register_globals по умолчанию изменилась с включенного состояния на выключенное. Для большинства пользователей это не очень важно, а зря. Ведь это напрямую сказывается на безопасности разрабатываемого продукта. Если вам необходимо сделать переменную глобальной, PHP-директива на этот параметр непосредственно не повлияет. Но некорректное использование уже может создать прецеденты безопасности.
Так, если register_globals находится во включенном состоянии, то перед исполнением написанного кода инициализируются различные переменные, которые необходимы, например, чтобы отправлять HTML-формы. Поэтому и было принято решение отключить её.
Почему состоянием данной директивы в php глобальная переменная обязана многим? Дело в том, что при включенном состоянии разработчики не всегда с уверенность могли сами себе ответить на вопрос, откуда она пришла. С одной стороны, это облегчало написание кода. Но с другой – это создавало угрозу безопасности. Поэтому, чтобы избежать ошибок, а также перемешивания данных и была отключена директива.
А теперь давайте рассмотрим не/безопасный код, а также как обнаружить случаи, когда объявление глобальной переменной PHP сопровождается попытками подмены данных. Это необходимо для того, чтобы создавать не только красивые, но и стабильно работающие сайты, которые не взломает первый попавшийся человек.
Опасный код
Давайте установим, что переменная является истинной для тех, кто прошел авторизацию:
if (authenticate_user()) {
$authorize = true;
}
if ($authorize) {
include "/highly/sensitive/data.php";
}
В данном состоянии переменная может устанавливаться автоматически. Учитывая, что данные могут быть попросту заменены, и источник их происхождения не устанавливается, то любой человек может пройти такую проверку и выдать себя за кого-то другого. При желании, злоумышленником (или просто любопытным, но неопытным человеком) может быть нарушена логика работы скрипта.
Если же изменить значение директивы, то данный код сможет работать корректно, как нам и требуется. Но инициализация переменных является не только хорошим тоном в программировании, но и даёт нам определённые гарантии стабильности работы скрипта.
Надёжный вариант кода
Для достижения этой цели можно или выключить работу директивы, или прописать более сложный код. Например, вот такой:
if (isset($_SESSION['username'])) {
echo "Привет <b>{$_SESSION['username']}</b>";
} else {
echo "Привет <b>Guest</b><br />";
echo "Приветствую, пользователь!";
}
Сделать подмену в этом случае уже будет сложно. Но всё же – возможно. Для этого необходимо позаботится о том, чтобы были предусмотрены инструменты оперативного реагирования. Если необходимо в PHP включить глобальные переменные, то можно использовать следующий инструмент: если мы знаем, в каком диапазоне будет полученное значение, можно прописать, чтобы скрипт проверял это с помощью сопоставления. Конечно, это тоже не гарантирует полноценную защиту от подмены значений. Но вот перебор возможных вариантов значительно усложнит.
Находит попытку подмены
Давайте проверим, как вы поняли написанное ранее. В PHP глобальные переменные в функции, что будет предоставлена ниже, вам необходимо будет объявить самостоятельно. Можно сказать, что это в некотором роде домашнее задание по усваиванию темы урока. Вот код:
<?php
if (isset($_COOKIE['C_COOKIE'])) {
} elseif (isset($_GET['C_COOKIE']) || isset($_POST['C_COOKIE'])) {
mail("administrarot@example.com", "Внимание, скриптом была зафиксирована попытка взлома и подмены данных", $_SERVER['REMOTE_ADDR']);
echo "Была нарушена безопасность или попытка так сделать. Администратор уведомлён";
exit;
} else {
}
?>
А теперь пояснения к нему. Переменная C_COOKIE приходит к нам из достоверного источника. Чтобы полностью в убедится в соответствии результата ожидаемому, мы проверяем её значение и в случае проблем уведомляем об этом администратора. Если же ничего не пришло, то никаких действий и не нужно совершать. Нужно понимать, что простое отключение директивы register_globals не делает ваш код безопасным. Поэтому любая переменная, которую получает скрипт от пользователя, должна быть проверена на ожидаемое значение.
Заключение
Вот, в общем, и всё, что необходимо знать про глобальные переменные, чтобы успешно и безопасно использовать их в своей деятельности. Конечно, сказать, что существует полноценная гарантия того, что ними никто не воспользуется нельзя – взломщики постоянно совершенствуют свои методы и умения. Поэтому желательно по максимуму ограничить использование глобальных переменных в коде. Благо, структура и особенности построения этого языка программирования позволяют достичь данной цели. Успехов!