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 () я знайшов в ній безпосередню вразливість, і в процесі мені довелося від цього відмовитися :( Що поробиш ...