Защита на PHP конфигурация

Помощен център

Защита на PHP конфигурация

PHP е най-популярният език за уеб програмиране. Към днешна дата над 80% от CMS сайтовете се програмират на PHP, между които WordPress, Joomla, Drupal, Magento, OpenCart, PrestaShop и много, много други.

За съжаление славата си има цена и поради своята популярност PHP е примамлива цел на глобалното хакерство, което превръща защитата на PHP конфигурацията в много важен за решаване въпрос.

В тази статия ще ви покажем няколко области, в които може да направите промени, които ще увеличат сигурността на вашата PHP конфигурация. Примерния код трябва да се въведе в рекурсивен php.ini файл за да са валидни настройките за всички сайтове в хостинга.

Ползвайте актуална версия на PHP

Преди всичко друго се уверете, че ползвате версия на PHP, която се поддържа активно и откритите уязвимости се ъпдейтват редовно. До края на 2018г. поддръжка по сигурността ще получава последната от започващите с цифрата 5 версии - това е PHP версия 5.6.

Ако вашия сайт ползва по-ниска версия на PHP от 5.6 нашата препоръка е да актуализирате PHP поне до версия 5.6. Много е вероятно ако дълго време не сте обръщали внимание на съобщения от разработчиците за налични ъпдейти да се наложат няколко отделни актуализации на ядро, тема, модули и т.н.

В най-лошия възможен случай ще трябва да вземете трудното решение дали да преизградите сайта на актуална и сигурна платформа.

Ограничаване достъпа на външни файлове

Деактивирането на тези опции гарантира, че fopen, fsockopen, file_get_contents и подобни функции могат да зареждат само локално съдържание:

allow_url_fopen = 0

allow_url_include = 0

Ограничаване времето за изпълнение на скриптове

Добре написан скрипт би трябвало да не се нуждае от повече време за изпълнение. Освен това ниските стойнности гарантират, че в случай на компрометиране скрипта няма да работи продължително време и, например да сканира хостинга, търсейки данни за достъп и друга поверителна информация (каквато в никакъв случай не трябва да пазите в хостинга в незащитен вид):

max_input_time = 30

max_execution_time = 30

В случай, че даден скрипт е компрометиран, тази настройка ефективно ограничава размера на паметта, която скриптът може да използва. Стойността по подразбиране на PHP 7 е 256M, но ви препоръчаме да тествате с доста по-ниски стойности докато установите оптималната стойност за нормална работа на вашия сайт:

memory_limit = 16M

Няма смисъл версията на PHP да се съдържа в хедърите на HTTP заявките:

expose_php = 0

Ограничете прякото извикване на PHP тъй като PHP трябва да се изпълнява само чрез пренасочване от уеб сървъра:

cgi.force_redirect = 1

Скриване на съобщения за грешки

Съобщенията за грешка никога не трябва да се показват на крайния потребител, тъй като съобщенията често съдържат подробна информация за кода на приложението и сървъра. Може да записвате съобщенията за грешка в отделен файл на сървъра:

display_errors = 0

display_startup_errors = 0

log_errors = 1

error_log = /home/cpaneluser/error_log

PHP грешките трябва да бъдат записани, за да се открие грешка в кода на приложението, както и да се разследват потенциалните уязвимости. Чрез използвеане на файловия мениджър в cPanel, удобно и сигурно място за файла за грешки е извън public_html.

Ограничаване на достъп до файлове

Open_basedir гарантира, че PHP може да включва файлове само от изброените директории. Това подобрява сигурността, като не позволява на PHP скриптовете да получат достъп до защитени файлове.

open_basedir = "/home/cpaneluser/upload"

Имайте предвид, че трябва да добавите всяка директория, до която PHP трябва да има достъп като директорията за качване на файлове и директорията за запис на сесии (вижте по-долу). Можете да добавите няколко директории в списъка, като поставите двоеточие между отделните директории:

open_basedir = "/home/cpaneluser/session:/home/cpaneluser/upload"

Защита на PHP сесии

PHP по подразбиране е конфигурирано да съхранява данни за сесиите на сървъра и бисквитка за проследяване от страна на клиента (обикновено се нарича PHPSESSID) с уникален идентификатор на сесията.

Следните настройки могат да се актуализират, за да се намали рискът от открадване на сесията.

Отхвърляне идентификационния номер на сесията на потребител, който не съвпада с текущия и създава нов. Това помага да се предотврати атака, наречена фиксиране на сесия (session fixation):

session.use_strict_mode = 1

Разрешете на бисквитката на сесията да бъде достъпна само от HTTP заявка, а не от други източници като JavaScript. Ако по някакъв начин е инжектиран JavaScript код за открадване на текущите бисквитки на потребителя (the document.cookie string), бисквитката httponly , която сте задали, няма да се покаже в списъка:

session.cookie_httponly = 1

Запазете ID на сесията в бисквитка, вместо да я изпращате като параметър на URL адреса. Това помага да се поддържа сесията на потребителя, като се предотвратяват атаките за фиксиране на сесията:

session.use_cookies = 1

session.use_only_cookies = 1

session.use_trans_sid = 0

Бисквитките съхраняват информацията си във формат ключ-стойност. Препоръчително е да актуализирате името на ключовете по подразбиране на бисквитката, в която се съхранява идентификационния номер на сесията. Актуализирайте customsessionid с име по ваш избор:

session.name = custom_session_id

Ако вашето уеб приложение работи с HTTPS протокол за защита, активирайте тази настройка, за да може бисквитките, съдържащи идентификатори на сесии, да бъдат достъпни само през защитена връзка:

session.cookie_secure = 1

Проверете откъде идва заявката, за да определите дали да разрешите достъпа до данни от сесиите. Актуализирайте example.com в кода с вашето домейн име за да предотвратите достъпа до информация за сесията, ако даден скрипт е зареден от външен източник:

session.referer_check = example.com

Сесийните файлове на потребителите се записват в обща директория. По-сигурно е да създадете отделна директория в хостинга без уеб достъп (най-подходяща е потребителската директория /home/cpaneluser/). Ако са налице ограничения на open_basedir, уверете се, че пътят до директорията за запис на сесии е включен в open_basedir:

session.save_path = "/home/cpaneluser/session"

SHA-512 е по-сигурен алгоритъм за хеширане за създаване на идентификационни сесии в сравнение със стандартната хеш функция MD5:

session.hash_function = sha512

Деактивирането на тези настройки гарантира, че променливите на сесията не могат да бъдат глобализирани, което подобрява сигурността:

session.bug_compat_42 = 0

session.bug_compat_warn = 0

Деактивиране на функции

Няколко PHP функции могат да се използват за атакуване на уеб приложения, ако не се използват внимателно. Деактивирането на тези функции като цяло е просто и ефективно решение на проблема. Ако приложението ви изисква някоя от изброените функции, просто я премахнете от списъка.

disable_functions = ini_set,php_uname,getmyuid,getmypid,passthru,leak,listen,diskfreespace,tmpfile,link,ignore_user_abord,shell_exec,dl,set_time_limit,exec,system,highlight_file,source,show_source,fpaththru,virtual,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_times,posix_ttyname,posix_uname,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate,phpinfo,popen,curl_exec,curl_multi_exec,parse_ini_file,allow_url_fopen,allow_url_include,pcntl_exec,chgrp,chmod,chown,lchgrp,lchown,putenv

Често използвани PHP директиви

Други често използвани директиви без кокретна връзка със сигурността на системата:

post_max_size = 100M

upload_max_filesize = 100M

Ако не качвате видео файлове стойността може да е далеч по-ниска - например 10M, тъй като огромни неоптимизирани .png изображения имат размер 5-6 MB.

date.timezone = Europe/London

Заключение

С актуализирането на тези настройки PHP средата ще бъде по-добре защитена при опити за атакуване (хакване).

Сигурността на сайтовете не е поле за експерименти затова при най-малки колебания или получаване на странни грешки свържете се с колегите от техническа поддръжка за съдействие.