Ако register_globals Off
Поради факта, че много често има въпроси относно глобалните променливи и проблемите, свързани с деактивирането на директивата register_globals, ще се опитаме да покрием тази тема малко в тази статия.
Първо, нека дефинираме какво представляват външните променливи. Това са всякакви променливи, които влизат в програмата отвън, т.е. не е дефинирано в самата програма. За php скрипт всички променливи, които се предават през реда на браузъра или през формата, са външни. Нека да видим как се създават.
Ако директивата register_globals = On е активирана на сървъра (в php.ini), тогава при предаване на променливи през формуляра или през реда на браузъра, в скрипта, към който са предназначени тези променливи, те ще бъдат създадени автоматично. Тези. ако редът на вашия браузър казва: www.server.ru/index.php?var=1, тогава променливата $var със стойност, равна на 1, ще бъде автоматично създадена в скрипта index.php.
Посочената директива е една от най-противоречивите точки в езика PHP. От една страна, използването му наистина може да доведе до реални проблеми със защитата на PHP скриптове, с неправилно разглеждане на възможни погрешни ситуации и много разработчици правилно отбелязват, че писането на скриптове без използване на глобални променливи намалява уязвимостта на скриптовете към различни атаки с 90%. От друга страна, в зората на PHP повече от хиляда потребители се довериха на разработчиците на езика (преди PHP 4.3 тази директива беше активирана по подразбиране), поради което в момента има милиони наистина функциониращи скриптове, написани с помощта на глобални променливи (Заслужава да се отбележи, че за образователни цели понякога е напълно полезно да се пишат скриптове с помощта на глобални променливи, тъй като замяната им със суперглобални масиви значително влошавачетливост на кода).
Повечето хост доставчици имат тази директива активирана в момента и вероятно ще остане активирана за дълго време, тъй като в противен случай приемствеността на кода може да бъде нарушена.
При дезактивирана директива register_globals достъпът до такива променливи е възможен по два начина:
- чрез асоциативни масиви HTTP_***_VARS (HTTP_POST_VARS и др.)
- чрез суперглобални масиви ($_ENV, $_GET, $_POST, $_SERVER, $_COOKIE, $_FILES и др.)
Суперглобалните масиви са налични във всякакъв обхват. Разработчиците на PHP препоръчват да изключите директивата register_globals на сървъра и да работите с променливи чрез суперглобални масиви. Тази препоръка е свързана с проблеми със сигурността, които могат да възникнат при активираната директива register_globals.
Въпреки че доскоро директивата register_globals остава активирана на хостинги. Ситуацията започна да се променя с пускането на PHP 5, където тази директива е изключена по подразбиране и хостовете не бързат да я включат (може би правилно).
И така, какво точно да направите, за да получите променливи - трябва да ги вземете от суперглобални масиви. Например, за да получите променливи, преминали през реда на браузъра, използвайте масива $_GET. Да кажем, че www.server.ru/index.php?var=1 е написано в реда на браузъра, тогава за да получите променливата var в index.php, трябва да напишете:
И, например, за да получите променливи, предадени от формуляра чрез метода POST в скрипта за обработка на формуляри, трябва да напишете:
Характеристиките на качения файл са достъпни чрез двумерния суперглобален масив $_FILES. В този случай променливата със стойностите на този масив може да изглежда така:
- $_FILES["име на файл"]["име"] (съдържа оригиналното име на файл наклиентска машина)
- $_FILES["filename"]["size"] (съдържа размера на качения файл в байтове);
- $_FILES["filename"]["type"] (съдържа MIME типа на файла);
- $_FILES["filename"]["tmp_file"] (съдържа името на временния файл, в който е записан каченият файл).
И за да използвате например променливата $DOCUMENT_ROOT, трябва да използвате суперглобалния масив $_SERVER: