Навигация
Главная
Поиск
Форум
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
21 ошибка прогр... 65535
HACK F.A.Q 65535
Бип из системно... 65535
Гостевая книга ... 65535
Invision Power ... 65535
Пример работы с... 65535
Содержание сайт... 65535
ТЕХНОЛОГИИ ДОСТ... 65535
Организация зап... 65535
Вызов хранимых ... 65535
Создание отчето... 65535
Имитационное мо... 65535
Программируемая... 65535
Эмулятор микроп... 65535
Подключение Mic... 65535
Создание потоко... 65535
Приложение «Про... 65535
Оператор выбора... 65535
Реклама
Сейчас на сайте
Гостей: 10
На сайте нет зарегистрированных пользователей

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

Моделирование информационно-поисковой библиографической системы на gpss ...
Моделирование работы участка термической обработки шестерен на GPSS + По...
Метод половинного деления для нахождения корня уровнения на Turbo Pascal...

Эмуляция директивы 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://www.kinolend.ru/
Опубликовал Kest November 06 2008 15:49:31 · 0 Комментариев · 16718 Прочтений · Для печати

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


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



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

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

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

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

Пароль



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

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

Случайные загрузки
PDJPack
Turbo Pascal for ...
Учебник для продв...
Прграммирование в...
База Allsubmitter...
Flud Vkontakte.ru
Assistant
PHP 5 в подлинник...
Программирование ...
Trojan [Исходник ...
Сложный калькулятор
Создание оригинал...
Учебник по создан...
Панель Наша Кнопка
DS_Group
Алгоритмы шифрова...
Averaging [Исходн...
PDJ Scrollers
VksButton
Профессиональное ...

Топ загрузок
Приложение Клие... 100793
Delphi 7 Enterp... 98016
Converter AMR<-... 20298
GPSS World Stud... 17059
Borland C++Buil... 14238
Borland Delphi ... 10373
Turbo Pascal fo... 7390
Калькулятор [Ис... 6080
Visual Studio 2... 5228
Microsoft SQL S... 3674
Случайные статьи
Модель — это всего...
Экзамен на програм...
Вулкан 24 игровые ...
Рекурсия
Эвакуатор Краснодар
Отображение в Dat...
Разделение трафика...
Как оформлять курс...
потенциальный пар...
Азартный гемблинг ...
Технология Android...
12.3. Пространство...
В свою очередь эта...
Альтернативные вар...
годовую подписку н...
Казино Вулкан игро...
решения для выделе...
определена данная ...
Разберемся теперь ...
Типичные размеры в...
Too many nested files
Enterprise Admins ...
Внимание - за вам...
Несколько прекрасн...
Комбинирование соб...
Статистика



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


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