Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование Register Globals

Q: Форма не отображает данные.
Q: Не видно параметров передаваемых скрипту.
Q: Переменная $page пустая, хотя я передаю do.php?page=2
Q: Что делать, если хостер выключил register_globals

Возможно, самое заметное изменение в PHP, это то что, изменилось значение по умолчанию для директивы register_globals. С версии 4.2.0 ее значение OFF.

Это сделано для облегчения написания безопасных скриптов. При разработке достаточно сложных проектов, когда число используемых переменных велико, очень легко можно допустить использование неинициализированной переменной, которая при register_globals=On может быть передана скрипту извне хакером.

<?php
if (authenticated_user()) {
   $authorized = true;
}

if ($authorized) {
   include "/highly/sensitive/data.php";
}
?>

Если register_globals=on, то переменной $authorized может стать TRUE, даже не если функция authenticated_user() вернет FALSE.

Теперь рассмотрим методы борьбы:

1. Использование предустановленных массивов:

  • $HTTP_GET_VARS - переменные переданные методом GET
  • $HTTP_POST_VARS - переменные переданные методом POST
  • $HTTP_COOKIE_VARS - значения Cookie
  • $HTTP_SESSION_VARS - переменные сессий
  • $HTTP_FILES_VARS - переменные закаченных файлов

Помните, что если вы используете предустановленные массивы не видны внутри функции, по этому необходимо действовать следующим образом:

function myfunction() {
    GLOBAL $HTTP_POST_VARS;

    print $HTTP_POST_VARS["page"];
    }

2. Использование суперглобальных массивов

Начиная с версии 4.1.0, PHP предоставляет дополнительный набор предопределенных массивов, содержащих переменные web-сервера (если они доступны), окружения и пользовательского ввода. Эти новые массивы являются особыми, поскольку они автоматически глобальны--то есть, автоматически доступны в любой области видимости.

  • $_GET - переменные переданные методом GET
  • $_POST - переменные переданные методом POST
  • $_COOKIE - значения Cookie
  • $_SESSION - переменные сессий
  • $_FILES - переменные закаченных файлов

Суперглобальные массивы не имеют недостатка описанного выше:

function myfunction() {
    print $_POST["page"];
    }

language.variables.predefined

3. Использование функции import_request_variables()

Функция позволяет импортировать GET/POST/Cookie переменные.

Синтаксис:

bool import_request_variables ( string типы [, string префикс])

Типы могут быть:

  • G - GET
  • P - POST
  • C - Cookies

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

Пример импортирующий GET, а поверх них POST переменные:

import_request_variables("gP", "rvar_");
echo $rvar_foo;

См. еще extract

Возможно, что из будущих версий PHP register_globals будет исключен вообще.


Оглавление

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
Аноним
Мне нравитсяМне не нравится
22 августа 2005, 18:06:10
В phpMyAdmin есть библиотека GrabVars
Если ее включить пто она сама их импортирует
2.
Аноним
Мне нравитсяМне не нравится
24 июля 2005, 15:05:23
И чего они взялись за эти глобалсы?..Нафиг они вообще с самого начала нужны были?...
3.
Аноним
Мне нравитсяМне не нравится
21 июля 2005, 13:20:21
Ух ты, не пропустил.... грамотно :)))
4.
Аноним
Мне нравитсяМне не нравится
21 июля 2005, 13:08:10
на этот сайт видимо ходят люди, с частичным дальтонизмом, которые не воспринимают шрифт написаный <font color=red>КРАСНЫМ</font> цветом!!!

P.S. интересно, тэги пропустит ??? :) это я про КРАСНЫЙ
5.
Аноним
Мне нравитсяМне не нравится
21 июля 2005, 12:59:07
мне кажется от реджистер_глобалс уже давно надо было избавиться, дабы на баловать народ .... :)
6.
Аноним
Мне нравитсяМне не нравится
17 апреля 2005, 21:01:14
Народ, никто не подскажет, почему, когда я пытаюсь записать в массив $_SESSION новую переменную, причем, делаю это я в функции, выдается сообщение об ошибке - ругается на присваивание значения массиву (на знак '=')? В функциях вообще можно использовать данный массив?
7.
Аноним
Мне нравитсяМне не нравится
20 мая 2004, 16:33:27
И все равно, как задавали вопросы на форуме, так и задают !!!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог