WEB-PROGRAMMING
Новое на сайте:
«    Июнь 2007    »
ПнВтСрЧтПтСбВс
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
Навигация
Главное меню:
Главная
Карта сайта
Форум
Ссылки
Поиск по сайту
Разделы сайта:
Софт
Скрипты
Новости
Книги
Игры
Эротика 18+
Для разработчиков:
Программирование
Языки
Технологии
Базы данных
Шаблоны для сайтов
Разное
Аккаунт
Логин
Пароль
 

Архив
Январь 2009 (463)
Декабрь 2008 (2442)
Ноябрь 2008 (1852)
Октябрь 2008 (1118)
Сентябрь 2008 (767)
Август 2008 (546)
Июль 2008 (44)
Июнь 2008 (7)
Май 2008 (11)
Апрель 2008 (369)
Март 2008 (28)
Февраль 2008 (16)
Январь 2008 (2)
Декабрь 2007 (1)
Август 2007 (2)
Июнь 2007 (6)
Май 2007 (3)
Апрель 2007 (17)
Март 2007 (34)
Статистика
bigmir)net TOP 100
Rambler's Top100
Яндекс цитирования
 

register_globals=on? Вы в опасности!

Категория: Программирование » Языки » PHP | Новость от: scorpion | 15 июня 2007

Что представляет собой register_globals?
Это опция в php.ini, которая указывает на необходимость регистрации переменных полученные методом POST или GET в глобальный массив $GLOBALS.

Для ясности приведу пример при register_globals=on.
Есть файл «index.php» с содержимом:



echo $asd.' - локальная переменная ';
echo $GLOBALS['asd'].' - ссылка в глобальном массиве $GLOBALS ';
echo $_GET['asd'].' - $_GET["asd"]';
?>

В адресной строке напишем: index.php?asd=123

Получим:


123 - локальная переменная
123 - ссылка в глобальном массиве $GLOBALS
123 - $_GET['asd']

Как мы видим, создались 2 переменные: одна локальная (+ ссылка в $GLOBALS), другая в массиве $_GET. Многие не используют массив $_GET вообще, они продолжают обрабатывать переменную «$asd» после получения ее извне.
Но давайте вдумаемся, зачем нам «загрязнять» массив $GLOBALS? Для этого у нас есть специальные массивы, хранящие данные, переданные методами GET (массив $_GET) и POST (массив $_POST).

Тот же самый пример, но при register_globals=off :


- глобальная переменная
- ссылка в глобальном массиве $GLOBALS
123 - $_GET['asd']

Т.о. не была создана локальная переменная и для манипулирования с «$asd» мы должны использовать массив $_GET.

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

А теперь я расскажу вам, как взломщик может воспользоваться этой опцией в своих целях, т.е. при register_globals=on
Начну от простого к сложному.

Часто мы видим предупреждения:


Notice: Undefined variable: asd(название переменной) in ****

Что это значит? Это значит, что переменная «$asd» не была определена явно.
Например, некоторые люди балуются подобным:



for($i=0;$i<10;$i++)
{
@$asd.=$i;
}

echo $asd
?>

Т.е. не определив переменную, сразу начинают ее использовать. Приведенный код по идее не страшен, но задумайтесь, а вдруг эта самая переменная «$asd», в последствие записывается в файл? Например, напишем следующее в строке адреса: «index.php?asd=LUSER+» и получим: «LUSER 0123456789». Ну разве приятно будет увидеть такое? Не думаю.

Предположим мы пишем систему аутентификации пользователя:



if($_POST['login']=='login'&&$_POST['pass']=='pass')
{
$valid_user=TRUE; // Юзер корректный
}

if($valid_user)
{
echo 'Здравствуйте, пользователь';
}
else echo 'В доступе отказано'
?>

Привел я заведомо дырявую систему, стоит нам только написать в адресной строке «index.php?valid_user=1» и мы получим надпись «Здравствуйте, пользователь»

Этого бы не случилось, если бы мы написали так:



if($_POST['login']=='login'&&$_POST['pass']=='pass')
{
$valid_user=TRUE; // Юзер корректный
}
else $valid_user=FALSE;

if($valid_user)
{
echo 'Здравствуйте, пользователь';
}
else echo 'В доступе отказано'
?>

Т.е. сами определили переменную $valid_user, как FALSE в случае неудачи.

Продолжим далее…
Теперь использование функции IsSet() становиться небезопасно, т.к. любой может подменить переменную на угодную ему.

Приведу пример с sql-инъекцией:



if(@$some_conditions) // некоторые условия
{
$where='id=3';
}

echo $query='SELECT id, title, description FROM table '
.'WHERE '.(IsSet($where)?$where:'id=4')
?>

В адресной строке напишем: «index.php?where=id=0+UNION+ALL+SELECT+login,+password,+null+FROM+admin+where+login='admin'» получим sql-инъекцию:


SELECT id, title, description FROM table WHERE id=0
UNION ALL SELECT login, password, null FROM admin where login='admin'

И взломщик получает ваши явки и пароли:(

Как вы видите все примеры, имеют дыры в защите, которые можно эксплуатировать через включенный register_globals.

Справиться с подобным можно, если всегда определять переменную вне зависимости от условий. Или же использовать инкапсуляцию переменных в функциях, т.е. когда вы определяете функцию, то переменные, что внутри нее будут закрыты извне, например:



function asd()
{
// Какие то действия

if(IsSet($where))
{
echo $where;
}
else echo '$where не существует';
}
asd();
?>

Теперь, если мы напишем в адресной строке: «index.php?where=123»
Даст: «$where не существует»
Но это при условии, что вы не устанавливаете переменную $where как глобальную, т.е. «global $where»

Я могу придумать еще очень много примеров, но думаю, что приведенных мною вам будет достаточно для понимания.
Хочу сказать, что все эти проблемы канут в лета, когда вы установите опцию register_globals=off и попробуете заново все приведенные выше примеры.

Это можно сделать как в php.ini, но большинство хостинг провайдеров вам это не позволят, потому придется воспользоваться файлом «.htaccess»

Создаем файл с названием: .htaccess
Запишем в него:


php_flag register_globals off

И все, теперь некоторые вопросы безопасности решены:)

Немного о причине написания мной этой статьи:
Лично я никогда не использовал register_globals = on, т.к. мне казалось это нелогичным. Так же я знал, что это еще один «+» к защите. Но в полной мере я не осознавал насколько это может быть опасно. Случилось это когда я решил написать GSMgen – Google SiteMap generator, который должен был работать безопасно и при включенном register_globals. Когда же я начал его тестировать, у меня был шок…так как мне нравиться использовать функцию IsSet() я нашел в ней непосредственную уязвимость, и в процессе мне пришлось от этого отказаться:( Что поделаешь…

Я очень надеюсь, что эта статья изменит ваше мнение относительно register_globals. Думаю, что со временем все хостинг провайдеры будут ставить register_globals = off по умолчанию. Но пока этого нет, вы знаете как с этим бороться;-)

Если у вас возникли вопросы, вы можете задать их на нашем форуме: http://www.internet-technologies.ru/forums/ или лично мне http://www.internet-technologies.ru/feedback.html

Удачи вам!

Источник: www.internet-technologies.ru
 (голосов: 1)
Версия для печати | Комментариев: 1
Написал: sipupix (12 июля 2008 22:34)
Спасибо, хорошая новость

--------------------
[цитировать]
Добавление комментария
Поиск
Технология Google

Друзья сайта
RIREG.NET
Персональный проект
Виктора Ткаченко
WebPskov.Com
FILMOROOM: Фантастические вселенные
Интернет-версия газеты
«Киевский вестник»
Независимый информационный портал
АНТИРЕЙДЕР
Реклама
Эротический видео-чат «Видео-девочка.ру»
Спутниковое TV
Немного про эксплуатацию спутникового ресивера Globo7010A

На форуме
  • "Спорт"
    от Orype4uk
    05.01.2009 18:19
    Просмотров: 3821
    Ответов: 18

  • "Кто, где живет ?"
    от EVGENIJJ
    29.12.2008 16:50
    Просмотров: 2955
    Ответов: 19

  • "Сколько вам лет?"
    от EVGENIJJ
    29.12.2008 16:48
    Просмотров: 6817
    Ответов: 31

  • "Какой был ваш первый компьютер"
    от EVGENIJJ
    29.12.2008 16:45
    Просмотров: 1444
    Ответов: 10

  • "Какой у вас компьютер?"
    от EVGENIJJ
    29.12.2008 16:40
    Просмотров: 4527
    Ответов: 19

  • "Ваша любимая игра?"
    от EVGENIJJ
    29.12.2008 16:37
    Просмотров: 10753
    Ответов: 58

  • "РАЗДАЧА 7 ЗНАКОВ"
    от EVGENIJJ
    28.12.2008 19:33
    Просмотров: 225
    Ответов: 3

  • Copyright © 2007 by DataLife Engine