Навигация
Главная
Поиск
Форум
FAQ's
Ссылки
Карта сайта
Чат программистов

Статьи
-Delphi
-C/C++
-Turbo Pascal
-Assembler
-Java/JS
-PHP
-Perl
-DHTML
-Prolog
-GPSS
-Сайтостроительство
-CMS: PHP Fusion
-Инвестирование

Файлы
-Для программистов
-Компонеты для Delphi
-Исходники на Delphi
-Исходники на C/C++
-Книги по Delphi
-Книги по С/С++
-Книги по JAVA/JS
-Книги по Basic/VB/.NET
-Книги по PHP/MySQL
-Книги по Assembler
-PHP Fusion MOD'ы
-by Kest
Professional Download System
Реклама
Услуги

Автоматическое добавление статей на сайты на Wordpress, Joomla, DLE
Заказать продвижение сайта
Программа для рисования блок-схем
Инженерный калькулятор онлайн
Таблица сложения онлайн
Популярные статьи
OpenGL и Delphi... 65535
Форум на вашем ... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Содержание сайт... 65535
Вызов хранимых ... 65535
Эмулятор микроп... 65535
Приложение «Про... 62850
Организация зап... 62068
Invision Power ... 61713
Оператор выбора... 61515
Подключение Mic... 60117
Модуль Forms 59471
Создание отчето... 59237
ТЕХНОЛОГИИ ДОСТ... 55468
Программируемая... 54491
Пример работы с... 52375
Имитационное мо... 50821
21 ошибка прогр... 45821
Реклама
Сейчас на сайте
Гостей: 12
На сайте нет зарегистрированных пользователей

Пользователей: 13,056
новичок: primeproxy
Новости
Реклама
Выполняем курсовые и лабораторные по разным языкам программирования
Подробнее - курсовые и лабораторные на заказ
Delphi, Turbo Pascal, Assembler, C, C++, C#, Visual Basic, Java, GPSS, Prolog, 3D MAX, Компас 3D
Заказать программу для Windows Mobile, Symbian

Моделирование автомойки на GPSS + Отчет + Блок схемы
Файл записей с выводом обратного заголовка на Turbo Pascal
База данных склада на Delphi + Схема БД

Реклама



Подписывайся на YouTube канал о программировании, что бы не пропустить новые видео!

ПОДПИСЫВАЙСЯ на канал о программировании
Эмуляция директивы register_globals on
Руслан Курепин
http://kurepin.ru/

Есть в PHP такая интересная директива, под названием register_globals, определенная в php.ini. Директива указывает компилятору, что значения входящих (глобальных) переменных следует изъять из их системных массивов и представить в виде самостоятельных переменных. К таким данным относится все, что передается в скрипт "снаружи": данные из форм, данные из URL, cookie и так далее. Лично мне эта директива нравится, ибо она экономит время написания скриптов и делает их более читаемыми. Сравните сами, что выглядит приятнее и удобнее для глаза:
Здравствуйте, уважаемый >, мы рады вам!

Здравствуйте, уважаемый , мы рады вам!

Вообще, лично я люблю PHP в основном за его удобочитаемость и быстрое написание.

Тем не менее, в каждой удобной фишке обязательно таится какая-нибудь гадость. Не обошлось без неприятностей и с регистрацией глобальных переменных. Невнимательные программисты оставляли в своих скриптах дыры, которые можно было обнаружить и использовать со стороны пользователя. Проще говоря, если переменная внутри скрипта участвовала в работе, но не устанавливалась этим же скриптом, ее можно было установить "снаружи", передав ее имя и значение в скрипт через URL, cookie или еще как-нибудь.

Эта дыра, которую записали в разряд "дыр в PHP" лично я считаю дырой в программировании, а не в языке, вынудила разработчиков PHP рекомендовать отключение register_globals. Что тут же было воспринято общественность как руководство к действию: все стали выключать регистрацию глобальных переменных на своих серверах.

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

Но повальный отказ от регистрации глобальных переменных привело к новой проблеме - многие скрипты надо переписывать чуть ли не с нуля, ибо надо проверить каждую строку, найти все используемые переменные и поменять их на "защищенные" аналоги.

Насколько я понимаю, подобная задача, в конце концов, сводится к тому, чтобы в начале работы скрипта присвоить привычным переменным их значения из глобальных массивов $_REQUEST, $_POST, $_GET, $_COOKIE, $_SERVER и т.д.

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

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

Если вы решили перенести все свои проекты на новый хостинг, а провайдер запрещает использовать регистрацию глобальных переменных - у вас проблемы.

Как быть? Не вычитывать же десятки, сотни, а иногда и тысячи страниц кода в поисках использования глобальных переменных.

Я предлагаю следующее решение. Надо просто эмулировать работу register_globals в одном отдельно взятом скрипте или в начале объектно-ориентированной стркутуры.

Как это сделать. Да не очень уж и сложно. Давайте рассуждать логически: имена переменных и их значения содержатся в соответствующих глобальных массивах. Как правило, используется массив $_REQUEST, который объединяет в себе все переменных GET, POST и COOKIE. Т.е. все, что передается скрипту из браузера, то, с чем работают скрипты.

Значит, надо извлечь из массива имена переменных, значения переменных и присвоить первому - второе. Извлечь - не проблема, для этого подойдет функция перебора всех ячеек массива foreach(), но как присвоить? Если у нас в $_REQUEST[username] содержится "atos", то как программно создать переменную $username со значением "atos"? Мы же не можем заранее знать, какие имена переменных будут в массиве $_REQUEST.

Вот тут нам поможет изумительная функция eval(), которая редко используется в обычном программировании, но буквально незаменима в некоторых случаях. О самой функции стоит написать отдельно, поэтому скажу только пару слов для тех, кто с ней не знаком.

Функция eval() заставляет PHP рассматривать обыкновенный текст, содержащийся в переменной, как фрагмент PHP-кода. Говоря языком примеров, результаты работы строк
echo 'Hello, User!';

и
eval("echo \'Hello, User!\';")

будет идентичными.

Вот eval() и поможет нам объявить все переменные из массива $_REQUEST. Выглядит это совсем коротко:
foreach($_REQUEST as $k=>$v)
{
eval("\$$k='$v';");
}

Вставьте этот цикл в самом начале вашего скрипта; он переберет массив глобальных переменных и объявит их не хуже register_globals. А может быть даже и лучше, т.к. глобальных массивов много, а вытаскивать переменные не обязательно из всех. Как правило, данных из массива $_REQUEST - вполне достаточно.

Однако, не стоит забывать и о безопасности вашего кода. Обратите внимание на специфику работы функции eval() - она обработает весь код, переданный ей в качестве параметра. Будьте осторожны, примите меры безопастности, чтобы злоумышленник не подсунул в качестве названия или содержимого переменной кусок своего php-кода или просто неверные данные, способные вызвать ошибку (например, имя переменной, начинающее с цифры или другого неразрешенного символа).
09.02.2003

P.S. После опубликования этой заметки, на форуме не один раз высказывались мысли о том, что вариант с eval() - не самый лучший. Лично я предпочитаю оставлять для себя "путь к отступлению", и eval() как раз привлекателен тем, что позволяет полностью контролировать процесс, добавляя необходимые проверки и ограничения в процедуру или наоборот - расширяя возможности кода. Например, можно добавить логирование регистрации отдельных переменных, чтобы знать - кто, куда, откуда, зачем, или четко запретить к регистрации определенные имена переменных или другие данные.

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

Метод "переменные переменных".
foreach($_REQUEST as $k=>$v)
{
$$k=$v;
}

Как видите, тоже простой метод, основанный на том, что значение переменной $k используется в качестве имени новой переменной. Удобно. Отличается автоматической регистрацией не только переменных, но и массивов. В случае с методом eval() придется проверять каждую переменную на is_array() и разворачивать (регистрировать) ее дополнительно, если такой массив вам нужен.

И самый простой метод - extract().

Весь код нашего примера будет выглядеть так:
extract($_REQUEST);

Это самый "тупой" метод, "разворачивающий" в переменные все, что содержится в массиве $_REQUEST. Нет абсолютно никакой гибкости в этом подходе - повлиять на регистрацию переменных или ввести какой-либо контроль вы не сможете, но выглядит очень лаконично.

И, наконец, не забывайте о том, что register_globals можно активировать не только в конфигурационном файле Apache, но и в файле .htaccess вашего сайта.

Удачи вам, и не пишите дырявых скриптов!

Все наши http://stalpro.com/katalog-metallokonstrukcii/reshotki.html производятся эксклюзивно для каждого заказчика.
Опубликовал Kest November 06 2008 00:39:20 · 0 Комментариев · 8577 Прочтений · Для печати

• Не нашли ответ на свой вопрос? Тогда задайте вопрос в комментариях или на форуме! •


Комментарии
Нет комментариев.
Добавить комментарий
Имя:



smiley smiley smiley smiley smiley smiley smiley smiley smiley
Запретить смайлики в комментариях

Введите проверочный код:* =
Рейтинги
Рейтинг доступен только для пользователей.

Пожалуйста, залогиньтесь или зарегистрируйтесь для голосования.

Нет данных для оценки.
Гость
Имя

Пароль



Вы не зарегистрированны?
Нажмите здесь для регистрации.

Забыли пароль?
Запросите новый здесь.
Поделиться ссылкой
Фолловь меня в Твиттере! • Смотрите канал о путешествияхКак приготовить мидии в тайланде?
Загрузки
Новые загрузки
iChat v.7.0 Final...
iComm v.6.1 - выв...
Visual Studio 200...
CodeGear RAD Stud...
Шаблон для новост...

Случайные загрузки
RAS
Delphi и технолог...
DirHTMLReportBuil...
CABfiles
Работа с картотеками
INSTANT BOOSTER v...
Delphi. Готовые а...
Фундаментальные а...
C++ : библиотека ...
Рисование PopupMenu
Crystal Button
Простой пример ка...
Эффект лампы на р...
Иллюстрированный ...
Основы Delphi. Пр...
Библия хакера 2 К...
ICQ
Редактор анимаций
Пользовательская...
WinAmp

Топ загрузок
Приложение Клие... 100363
Delphi 7 Enterp... 81633
Converter AMR<-... 20042
Borland C++Buil... 10959
GPSS World Stud... 10124
Borland Delphi ... 7986
Turbo Pascal fo... 6949
Visual Studio 2... 4957
Калькулятор [Ис... 4208
FreeSMS v1.3.1 3506
Случайные статьи
Неоднозначность ключа
Сопротивление = На...
Суммирование маршр...
Основные конструкц...
Основы
Что нужно делать п...
После утверждения ...
0 для совместимост...
Циклические связан...
Можно ли в Интерне...
Навигация по данны...
Алгоритм inner_pro...
Новый корпус для ж...
Как не платить МГТ...
Оптимизация сайта ...
Делай уроки сам
Особенности обрабо...
Можно ли найти сам...
Пример работы с по...
Общение в ICQ
Развертывание дере...
ПСЕВДОКЛЮЧ АККУРАТ...
Модуль CGI.pm
анне Тип Choices о...
Настенные кондицио...
Статистика



Друзья сайта
Программы, игры


Полезно
В какую объединенную сеть входит классовая сеть? Суммирование маршрутов Занимают ли таблицы память маршрутизатора?