AGAVA partners programs http://agava.ru/partners/            

Название функции

             
Веб-курсы


Что это?

Оглавление

Основы
Основы основ

Практика
Гостевая книга
Простой сайт
Структура сайта (MVC)
Ядро (Light)
Ядро
Гостевая на SQL
Статические страницы
Модуль новостей
Система регистрации

Теория
Дебаггинг
Регулярные выражения
Введение в ООП
Паттерны проектирования

Репозитарий
BB-code
Почтовый класс
Пагинатор
Всякие полезности

Download
Полезные утилиты

Разное
Видеокурсы
Последние изменения
Вопросы и замечания сюда



Реклама

Диеты для похудения
Фреймворк Kohana. Обучение. Мануал на русском.







register_globals


Мы уже разбирались с областями видимости. Напомним.

Переменные в программе PHP (скрипте) видны не везде одинаково. То есть не из любой части программы можно обратиться к какой-либо переменной.
Таких уровней четыре - глобальная область видимости, локальная, классы и функции. Так вот, те переменные, которые находятся в глобальной области видно везде. А те, которые в функциях к примеру, не видны за их пределами.
Что бы в функции стало видно переменную из локальной области (тела программы), нужно объявить переменную глобальной. Запутал? Ничего страшного, сейчас распутаем. Когда прочитаете всю страницу - вернитесь сюда. И это не покажется уже такой бессмыслицей.

Вообще все переменные, задействованные в скрипте, это массив $GLOBALS, элементами которого они и являются. Что бы посмотреть на эту кухню изнутри, можно просто распечатать этот массив:
1
2
3
4
5
6
7
<pre> 
<?php    
    print_r
($GLOBALS); 
?> 
</pre>

и поизучать.

Первыми обычно бывают так называемые "переменные окружения". Это то, что находится в массивах $_ENV и $HTTP_ENV_VARS. Это очень интересные массивы и заслуживают отдельной темы. Не будем сейчас отвлекаться.

А вот следом парами идут массивы $_POST ($HTTP_POST_VARS), $_GET ($HTTP_GET_VARS), $_COOKIE (HTTP_COOKIE_VARS) и так далее.

Почему они парами. Вот мы и подошли к самому интересному.

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

Рассмотрим два, самых используемых - $_POST ($HTTP_POST_VARS) и $_GET ($HTTP_GET_VARS). Для этого сделаем форму:
1
2
3
4
5
6
7
8
9
10
<form action="?var=get" method="post"> 
<input name="var" type="submit" value="post" /> 
</form> 
<pre> 
<?php  
    print_r
($GLOBALS);     
?> 
</pre>

Если теперь нажать кнопку, то образуется элементы массивов $_POST и $HTTP_POST_VARS (post), а так же $_GET ($HTTP_GET_VARS) (get):
    [_POST] => Array
        (
            [var] => post
        )

    [HTTP_POST_VARS] => Array
        (
            [var] => post
        )

    [_GET] => Array
        (
            [var] => get
        )

    [HTTP_GET_VARS] => Array
        (
            [var] => get
        )


Откуда они взялись? Их передал браузер. get из адресной строки, а post из формы.
Обратите внимание, что во всех четырех массивах они называются одинаково - "var".

А теперь фокусы. Откройте файл .htaccess и напишите в него это:
php_flag register_globals On


Этим самым мы разрешаем PHP обрабатывать массивы $HTTP_POST_VARS и $HTTP_GET_VARS как глобальные, то есть их станет видно непосредственно в теле программы. Можно в этом убедиться:
1
2
3
4
5
6
7
8
9
10
11
12
<form action="?var=get" method="post"> 
<input name="var" type="submit" value="post" /> 
</form><br /> 
<pre> 
<?php 
    
echo '$var = '$var
    echo 
'<br><br>';  
    
print_r($GLOBALS);     
?> 
</pre>
Теперь, если нажать кнопку, то мы увидим, что переменной $var присвоено значение "post" Но позвольте, а почему не "get"? Ведь в массиве $HTTP_GET_VARS тоже есть элемент var

Скажу Вам больше, если сделать так:
1
2
3
4
5
6
7
8
9
10
11
12
13
<form action="?var=get" method="post"> 
<input name="var" type="submit" value="post" /> 
</form><br /> 
<a href="?var=get">get</a><br /><br /> 
<pre> 
<?php 
    
echo '$var = '$var
    echo 
'<br><br>';  
    
print_r($GLOBALS);     
?> 
</pre>

то значение уже будет меняться в зависимости от того, что нажато - кнопка или ссылка. А это путаница. Потому что в массивах у элементов с одинаковым именем значения разные. А теперь их оба видно в теле программы. И кто кого перезапишет - не ясно.

Кроме того, что это вносит изрядную путаницу в регистрации переменных, так еще и является приличной дыркой в безопасности. Потому что появляется возможность перезаписи переменных в глобальном массиве. К примеру так:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<form action="" method="post"> 
<input name="password" type="text" /> 
<input name="var" type="submit" value="post" /> 
</form><br /> 
<a href="?key=1">Злой шпиён</a><br /><br /> 
<?php 

    
if($password == 'ракета'
        
$key true
         
         
    if(
$key
        echo 
'Проходи'
    else 
        echo 
'Стой, кто идет!';


Если пароль не совпадает, то значит никого не пустим. Но злой шпион пойдет в обход и перезапишет ключ через массив $HTTP_GET_VARS
Так что Отчизна в опасности и нужно немедленно отключить возможность такой регистрации переменных:
php_flag register_globals Off


Oднако как теперь получить значение для переменной $password? Делается это инициализацией, то есть прямым присвоением значений из нужных массивов, а за одно и не помешает инициализировать и ключ:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<form action="" method="post"> 
<input name="password" type="text" /> 
<input name="var" type="submit" value="post" /> 
</form><br /> 
<a href="?key=1">Злой шпиён</a><br /><br /> 
<?php 

    $password 
= !empty($_POST['password']) ? $_POST['password'] : NULL
    
$key false

    if(
$password == 'ракета'
        
$key true
         
         
    if(
$key
        echo 
'Проходи'
    else 
        echo 
'Стой, кто идет!';
Вот теперь уже граница на замке.
Рейтинг@Mail.ru Рейтинг@Mail.ru Яндекс цитирования
irbis-team © 2009