PHP файл с тайни
В предишната статия от поредицата започнахме да разглеждаме системни променливи или PHP директиви, които се задават чрез файла php.ini и ви позволяват да настроите фино средата за изпълнение на PHP. Сега ще продължим с най-важните директиви - познаването и разбирането как работят ще ви позволи да контролирате напълно работата на PHP, да изградите по-сигурен уеб сайт или да подобрите производителността на вашето приложение.
Ще разгледаме конфигурацията на PHP версия 5.0.x, така че ако имате по-ранна версия, някои директиви може да липсват.
error_log = [няма/път към регистрационния файл] – задава пътя към регистрационния файл, където ще се записват съобщения за грешка и друга информация за отстраняване на грешки. Файлът трябва да се намира на сървър (не на отдалечен компютър) и да може да се записва.
arg_separator.output = ["&"/"друг знак или набор"] - позволява ви да посочите набор от разделителни знаци, които се използват при кодиране на HTTP заявки. Например стандартният разделител на променливи е знакът амперсанд (&). Можете да зададете набор от множество разделители, като PHP разглежда всеки от тях като възможен разделител - ако първият указан символ е неуспешен, PHP ще опита други. Разделителите са посочени под формата на техните кодове.
arg_separator.input = [";&"/"друг символ или набор"] - подобно на предишната опция, сочи към знака за разделител на полето, когато генерира връзки с помощта на PHP.
variables_order = ["EGPCS"] - казва на PHP къде и в какъв ред да търси променливи. Буквите показват къде PHP търси съответната променлива - E (променливи на средата), G (съдържание на GET заявка), P (съдържание на POST заявка), C (променливи на бисквитка) и S (системни променливи). Търсеневъзниква в ред отляво надясно и със същия приоритет. Тоест, ако има променливи с едно и също име, PHP ще вземе тази, която се появява първа - в този случай променливата на средата (E) ще има по-висок приоритет от променливата, подадена в HTTP заявката.
post_max_size = [8M/всяко цяло число M/K] - задава максималния размер на данните, изпратени чрез POST заявка. Тази директива може да бъде зададена само чрез файловете php.ini и httpd.conf.
magic_quotes_gpc = [Вкл./Изкл.] – активира автоматична обработка на знаци за кавички. Тъй като тези символи се използват като една от езиковите конструкции и са служебни символи, PHP може автоматично да ги замени със специалната \' последователност за безопасна обработка. Тази директива се използва за обработка на потребителски данни, получени чрез GET/POST/Cookie.
magic_quotes_runtime = [Off/On] - подобно на предишната директива, с тази разлика, че нейният ефект се прилага за променливи, получени в резултат на скрипта, например данни от базата данни. По подразбиране директивата е деактивирана и програмистът трябва да обработва собствените си данни.
default_mimetype = ["text/html"/valid MIME-type] - По подразбиране PHP скриптът предоставя на потребителя информация под формата на обикновен текст (съответният MIME тип на тези данни е text/html). Но ако пишете конкретна програма, тогава може да се наложи да промените тази стойност на типа данни, от който се нуждаете. Или, ако искате да посочите, че скриптът ще върне други данни, като поток от двоични данни или аудио поток, тази променлива може да бъде променена с помощта на функцията ini_set().
default_charset = ["iso-8859-1"/валиден набор от символи] - тази директива е деактивирана по подразбиране. Чрез него се задава кодировката, в коятоPHP скриптът изпраща данни на потребителя.
file_uploads = [On/Off] – позволява приемането на файлове от потребители, изпратени чрез HTML формуляри.
upload_tmp_dir =[none/path to directory] – ако качването на файлове е разрешено, PHP автоматично ще ги обработи и съхрани във временна директория. Ако директивата upload_tmp_dir не е зададена (и първоначално е деактивирана), тогава PHP използва системната временна директория за съхраняване на качени файлове. В скрипта трябва ръчно да обработвате такива файлове, например чрез функцията move_uploaded_file ().
upload_max_filesize = [2M/integer M/K] – задава максималния размер на файла, който е разрешен за качване в скрипта. Между другото, тъй като файлът се предава в тялото на POST заявката, друга директива,post_max_size, също влияе върху неговия размер, така че е желателно допустимият размер на файла да бъде по-малък от общия размер на POST данните. Например, ако искате да разрешите качването на няколко файла едновременно, тогава е необходимо общият им обем да е по-малък от post_max_size, а размерът на всеки поотделно да не надвишава upload_max_filesize.
default_socket_timeout = [60/integer] - задава времето за изчакване за данни от сокета преди затваряне на връзката.
include_path = [".;/usr/local/php5/PEAR"] – съдържа набор от пътища за търсене на PHP модули и класове. Ако използвате разширението PEAR, посочете пътя до директорията, разделени с точка и запетая. Текущата директория на скрипта е посочена първа по подразбиране. Директивата може да бъде зададена и програмно, но е желателно първо да получите текущата й стойност – функцията ini_get('include_path') и просто да добавите желаната директория към списъка чрез извикването ini_set().
extension_dir = ["/usr/local/php5/ext"] – задава пътя до директорията с разширени модули. В старитеВъв версиите на PHP тази директория се нарича extensions, в по-новите версии е съкратена до само ext, въпреки че можете да поставите модули във всяка директория. В PHP за платформата win32 разширенията са обикновени DLL файлове, за Linux/Unix платформи, файлове с разширение *.so.
enable_dl = [On/Off] – позволява зареждане и използване на динамични модули.
разширение = [php_curl.dll/module file] - Тази директива указва кой PHP модул може да бъде зареден. Това е единствената от всички директиви, която може да се използва многократно. При всяко извикване трябва да съдържа името на файла (заедно с разширението), който съдържа необходимия модул. Имайте предвид, че са посочени само имена на файлове и директорията, в която PHP ги търси, се определя от директиватаextension_dir. Традиционно всички модули имат име, състоящо се от префикса php_ и името на модула. Например името на модула mcrypt, който ви позволява да използвате криптографски функции в скриптове, ще бъде php_mcrypt.dll (на win32) или php_mcrypt.so (на Linux/Unix).
За да заредите няколко модула едновременно, просто укажете зареждането на всеки модул на отделен ред:
разширение=php_gd2.dll ;разширение=php_mbstring.dll разширение=php_mcrypt.dll
PHP започва да работи с модули на етапа на инициализация, като проверява наличността на всички файлове за зареждане, така че всички директиви, свързани с модулите, могат да бъдат зададени само чрез файловете http.conf и php.ini. Ако някой модул не бъде намерен, тогава PHP ще генерира грешка, но ще продължи да работи, тъй като модулите не засягат основната функционалност. Препоръчително е да не свързвате ненужни разширения без нужда - в някои случаи това може само да забави работата и да повлияе на цялостната сигурност на сървъра.
И в заключение,няколко директиви, свързани със сигурността.
expose_php = [On/Off] - отвън може да изглежда, че това е невинна опция, която позволява на PHP да показва информация за своята версия в HTTP отговора на сървъра. Разработчиците съветват да го оставят активиран, тъй като това може да допринесе за разпространението на PHP, тъй като въз основа на анализа на отговорите на сървъра, например, се събират глобални статистики за използването на PHP. Но в същото време това предоставя безценна информация за потенциален хакер - в крайна сметка, като имате точна информация за версията и номера на софтуера, инсталиран на сървъра, е много по-лесно да изберете метод за хакване. Поради това се препоръчва да деактивирате тази директива на производствените сървъри, особено ако изпълнявате сериозни приложения от страната на сървъра.
doc_root = [няма/път към директория] – може да зададе директорията, където да се поставят PHP скриптовете. Тази директива позволява изпълнението на скриптове само в указаната директория и нейните поддиректории, като забранява изпълнението на всички други скриптове. Ако изграждате най-сигурната уеб система, тогава ще бъде много полезно за вас да използвате възможностите на тази директива. По подразбиране е деактивиран.