Меню

Php register globals настройка



Директива Register_globals

Опишем директиву Register_globals и все подводные камни ее использования, с которыми может столкнуться вебмастер при написании программ.

Одним из самых спорных вопросов в разработке PHP стала замена в версии 4.2.0 по умолчанию параметра директивы Register_globals в положение OFF. Большинство программистов думали, что это реализация языка программирования PHP, а не простая настройка интерпретатора. Начиная с версии PHP 5.4.0 директива была удалена.

В данной статье мы разберемся, как директива Register_globals влияет на безопасность приложений, а именно неправильное использование всех ее возможностей.

При активном состоянии директивы Register_globals выполняется инициализация различных переменных. А поскольку PHP не требует инициализации, то очень легко можно осуществить потенциально опасный код. Самой большой проблемой для программистов является неуверенность, откуда именно пришла та или иная переменная и на сколько ей доверять. Переменные, которые определил разработчик в скрипте, и переменные, передаваемые пользователем снаружи, могли перемешиваться, что в дальнейшем могло причинить очень много ошибок.

Приведем пример, касающийся безопасности авторизации. Данный пример далек от практического использования, но он отражает суть пробелы в безопасности. Скрипт использует проверочную переменную $is_logged, в которой хранится логическое значение авторизации пользователя. Итак проверка осуществляется следующим образом:
Если условия не выполнены, значит пользователь не авторизован. Но, авторизоваться ему поможет именно директива Register_globals. Создаем GET запрос:
Таким образом, мы меняем необходимую нам переменную, и на экране появится Привет, пользователь!

Чтобы обойти эту ошибку, достаточно сначала инициализировать переменную:
При таком решении локальная переменная перетрет глобальную по методу GET.

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

С методом GET разобрались, перейдем к методу POST.
После отправки данных в переменной $par автоматически содержаться значение, введенное в текстовое поле. Это означает, что переменная $_POST[‘par’] и $par будут иметь одинаковые значения.

Перейдем к Cookie:
Как видно из примера, переменная $login будет содержать такое же значение, как и переменная $_COOKIE[‘login’].

Приведем еще один аналогичный пример, в котором будем использовать сессии:
В данном примере мы используем переменную $username. Проблема заключается в том, что мы не можем быть уверены в ее значении, поскольку $username могла быть передана в GET-запросе через URL.

Обратите внимание, что Register_globals не может быть установлена ​​при исполнении функцией Ini_set. Хотя, вы можете использовать .htaccess, если ваш сервер позволяет это:
Также необходимо заметить, что директива Register_globals зависит от директивы Variables_order.

Источник

Настройка параметров PHP

  • В первом случае PHP функционирует как модуль веб-сервера Apache, поэтому настройки PHP необходимо указывать в файле .htaccess.
  • Во втором случае настройки PHP необходимо указывать в файле php.ini, который располагается в директории cgi-bin вашего сайта.

По умолчанию на новых серверах PHP работает в режиме mod_php, но при желании вы можете подключить режим mod_cgi, воспользовавшись нашей инструкцией.

Настройка опций в файле .htaccess

Директивы необходимо добавлять в самый конец или в самое начало файла, вне блоков кода . .

Читайте также:  Настройка тюнера спутниковой антенны самостоятельно orton

apc.cache_by_default

APC — акселератор PHP, использование которого увеличивает производительность интерпретатора за счет кэширования. В отдельных случаях, однако, может потребоваться его отключение — например, если скрипты не выполняются корректно из-за переполнения кэша.

Управление APC осуществляется директивами:

default_charset

Директива указывает кодировку по умолчанию (например, cp1251, utf-8, koi8-r) для всех выдаваемых страниц.

display_errors

Директива указывает, требуется ли выводить ошибки на экран вместе с остальным выводом, либо ошибки должны быть скрыты от пользователя.

Включение и выключение осуществляются следующим образом:

log_errors

Опция позволяет включить логирование ошибок php с их записью в произвольный файл (в примере errors.log). При указании пути к файлу замените u и user на первую букву вашего логина и сам логин.

magic_quotes_gpc

Волшебные кавычки (Magic Quotes) — это процесс автоматического экранирования входящих данных PHP-скрипта. Если опция включена, то одинарные (‘) и двойные («) кавычки и обратный слэш (\)экранируются обратным слэшем автоматически.

Включение и выключение magic_quotes осуществляется директивами:

mail.add_x_header

Опция позволяет включить логирование отправки почты из скриптов сайта. Логи будут содержать полный путь до скрипта, адрес получателя и заголовки. При указании пути к файлу, в который будут записываться логи (mail.log), замените u и user на первую букву вашего логина и сам логин.

max_input_vars

Директива указывает, сколько входных переменных может быть принято в одном запросе. Например:

mbstring.func_overload и mbstring.internal_encoding

Чаще всего к данным функциям требуется обращаться для настройки корректной работы сайтов на CMS Битрикс. В этом случае должны быть указаны следующие параметры:

При этом для большинства других CMS необходимы иные значения этих функций:

opcache.revalidate_freq

Отключение OpCache (настройка требуется для CMS Битрикс):

pcre.recursion_limit

Устанавливает лимит на рекурсию.

post_max_size

Опция устанавливает максимально допустимый размер данных, отправляемых методом POST. Также это значение также влияет на загрузку файлов — для загрузки больших файлов оно должно быть больше значения директивы upload_max_filesize.

register_globals

Директивы для включения/выключения глобальных переменных:

request_order

Директива регулирует порядок, в котором PHP добавляет переменные GET, POST и Cookie в массив _REQUEST.

upload_max_filesize

Устанавливает максимальный размер закачиваемого файла.

Настройка опций в файле php.ini

allow_url_fopen

Опция включает поддержку оберток URL (URL wrappers), которые позволяют работать с объектами URL по протоколам ftp или http как с обычными файлами.

Включение опции (для отключения значение = 0):

apc.cache_by_default

APC — акселератор PHP, использование которого увеличивает производительность интерпретатора за счет кэширования. В отдельных случаях, однако, может потребоваться его отключение — например, если скрипты не выполняются корректно из-за переполнения кэша.

Отключение APC (для включения значение = 1):

default_charset

Указание кодировки по умолчанию:

display_errors

Включение вывода ошибок (для выключения значение = off).

magic_quotes_gpc

Отключение Magic Quotes (для включения значение = 1):

mail.add_x_header

Включение логирования отправки почты из скриптов сайта. В директиве mail.log указывается путь к файлу, в который будут сохраняться логи (замените u и user на первую букву вашего логина и сам логин).

max_input_vars

Изменение количества вводимых переменных:

mbstring.func_overload и mbstring.internal_encoding

Настройки для CMS Битрикс:

opcache.revalidate_freq

Отключение OpCache (настройка для CMS Битрикс):

Читайте также:  Seo ultimate для wordpress настройка

pcre.recursion_limit

Лимит на рекурсию:

post_max_size

Максимальный размер данных, отправляемых методом POST. Это значение также влияет на загрузку файлов — для загрузки больших файлов оно должно быть больше значения директивы upload_max_filesize.

register_globals

Отключение Register Globals (для включения значение = 1):

request_order

Регулирует порядок, в котором PHP добавляет переменные GET, POST и Cookie в массив _REQUEST.

upload_max_filesize

Устанавливает максимальный размер закачиваемого файла.

Опции, которые не могут быть изменены

К настройкам PHP, изменение которых невозможно в рамках виртуального хостинга, относятся:

Источник

Использование глобальных переменных (Register_Globals)

Данная возможность была помечена УСТАРЕВШЕЙ начиная с версии PHP 5.3.0 и была УДАЛЕНА в версии PHP 5.4.0.

Пример #1 Пример опасного кода с register_globals = on

// устанавливаем переменную $authorized = true только для пользователей, прошедших авторизацию
if ( authenticated_user ()) <
$authorized = true ;
>

// Поскольку в случае неудачи при проверке авторизации переменная $authorized
// не установлена, она может быть установлена автоматически, благодаря register_globals,
// например, при GET запросе GET auth.php?authorized=1.
// Таким образом, любой может пройти эту проверку!
if ( $authorized ) <
include «/highly/sensitive/data.php» ;
>
?>

В случае register_globals = on логика работы скрипта может быть нарушена. В случае, если установленное значение off, переменная $authorized не может быть установлена из внешних данных запроса, и скрипт будет работать корректно. Но все же инициализация переменных — один из признаков хорошего тона в программировании. Например, в приведенном выше участке кода мы могли поместить $authorized = false в качестве первой строки. Такой код работал бы как со значением on, так и off опции register_globals, и подразумевая, что по умолчанию пользователь не проходил авторизацию.

Приведем еще один пример, использующий сессии. В случае, если register_globals = on, мы можем использовать переменную $username в приведенном ниже примере, но тогда у нас не будет уверенности в достоверности ее значения (к примеру, $username могла быть передана в GET-запросе через URL ).

Пример #2 Пример использования сессий со значением register_globals on или off

// Мы не знаем, откуда получена переменная $username, но точно знаем, что
// переменная $_SESSION хранит в себе данные сессии
if (isset( $_SESSION [ ‘username’ ])) <

echo «Hello Guest
» ;
echo «Would you like to login?» ;

Также существует возможность реализации оперативного реагирования в случае попытки подмены переменных. Так как во время разработки приложения мы знаем ожидаемое значение переменной, а также знаем ее достоверное значение, мы можем их сопоставить. Это не защитит код от подмены переменных, но усложнит перебор возможных вариантов. Если вы не хотите знать, как именно были получены внешние данные, используйте переменную $_REQUEST , которая является смесью из данных GET и POST запросов, а также данных COOKIE. Также, информацию об этом можно найти в разделе внешние данные в PHP.

Пример #3 Обнаружение попытки подмены переменных

if (isset( $_COOKIE [ ‘MAGIC_COOKIE’ ])) <

// MAGIC_COOKIE получена из достоверного источника.
// Для полной уверенности необходимо проверить ее значение.

> elseif (isset( $_GET [ ‘MAGIC_COOKIE’ ]) || isset( $_POST [ ‘MAGIC_COOKIE’ ])) <

mail ( «admin@example.com» , «Обнаружена попытка взлома» , $_SERVER [ ‘REMOTE_ADDR’ ]);
echo «Обнаружено нарушение безопасности, администратор уведомлен.» ;
exit;

Читайте также:  Nokia lumia настройки громкость

// MAGIC_COOKIE в данных запроса не присутствует

Следует понимать, что установка register_globals в off не сделает ваш код безопасным. Каждую полученную от пользователя переменную следует проверять на соответствие ожидаемому значению. Всегда проверяйте ввод пользователя и инициализируйте все используемые переменные! Для проверки на наличие неинициализированных переменных можно включить в опцию error_reporting() отображение ошибок категории E_NOTICE .

О том, как эмулировать включенное или отключенное состояние register_globals, смотрите этот FAQ.

Источник

Директива register_globals

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

Директива register_globals позволяет регистрировать переменные, полученные из GET-запроса. Допустим, был такой запрос: index.php?a=15. Таким образом, безусловно, создаётся переменная $_GET[«a»] и переменная a. Вот создание переменной a и произошло в результате включённой директивы register_globals.

Теперь о том, почему данную директиву надо всегда держать отключённой. Предположим, что Вы делаете авторизацию пользователя, и Вы написали такой код:

Теперь если файл называется, например, auth.php, то, обратившись к нему следующим образом: auth.php?check_user=1, то получится успешная авторизация, независимо от того, какие логин и пароль были отправлены и были ли отправлены вообще.

Безусловно, данный пример является слегка мистическим, поскольку так никто не пишет (хотя бы из-за отсутствия else $check_user = false;), однако, данный пример наглядно показывает, к чему может привести включённая директива register_globals.

Теперь о том, как же отключить директиву register_globals. Для этого надо добавить в файл .htaccess всего одну строчку:

php_value register_globals 0

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 2 ):

    Mihail u vas opechatka v etoj statje , v pervom obzace » ob ja napishu v etoj statje».

    Уже исправил, спасибо!

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

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Источник

    Adblock
    detector