Register_globals on ви в небезпеці, php

Що являє собою register_globals?
Це опція в php.ini, яка вказує на необхідність реєстрації змінних отримані методом POST або GET в глобальний масив $ GLOBALS.

Для ясності приведу приклад при register_globals = on.
Є файл «index.php» з вмісті:

Той же самий приклад, але при register_globals = off:

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

Можливо, вже зараз ви змінили свою думку про register_globals.
Ймовірно, вам доведеться щось переписати в своїх програмах, але воно того варте.

Нині ж я розповім вам, як зломщик може скористатися цією опцією у своїх цілях, тобто при register_globals = on
Почну від простого до складного.

Часто ми бачимо попередження:

Notice: Undefined variable: asd (назва змінної) in ****

Що це означає? Це означає, що змінна «$ asd» не була визначена явно.
Наприклад, деякі люди балуються подібним:

Припустимо ми пишемо систему аутентифікації користувача:

Цього б не сталося б, якби ми написали так:

Тобто самі визначили змінну $ valid_user, як FALSE в разі невдачі.

Продовжимо далі ...
Тепер використання функції IsSet () стає небезпечно, тому що будь-хто може підмінити змінну на бажану йому.

Наведу приклад з sql-ін'єкцією:

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

І зломщик одержує ваші явки і паролі :(

Як ви бачите всі приклади, мають діри в захисті, які можна експлуатувати через включений register_globals.

Справитися з подібним можна, якщо завжди визначати змінну незалежно від умов. Або ж використовувати інкапсуляцію змінних у функціях, тобто коли ви визначаєте функцію, то перемінні, що всередині неї будуть закриті ззовні, например:

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

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

Створюємо файл з назвою. htaccess
Запишемо в нього:

php_flag register_globals off

І все, тепер деякі питання безпеки вирішені :)

Трохи про причині написання мною цієї статті:
Особисто я ніколи не використовував register_globals = on, тому мені здавалося це нелогічним. Так само я знав, що це ще один «+» до захисту. Але в повній мірі я не усвідомлював наскільки це може бути небезпечно. Сталося це коли я вирішив написати GSMgen - Google SiteMap generator, який повинен був працювати безпечно і при включеному register_globals. Коли ж я почав його тестувати, у мене був шок ... так як мені подобається використовувати функцію IsSet () я знайшов в ній безпосередню вразливість, і в процесі мені довелося від цього відмовитися :( Що поробиш ...