Защита на 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 средата ще бъде по-добре защитена при опити за атакуване (хакване).
Сигурността на сайтовете не е поле за експерименти затова при най-малки колебания или получаване на странни грешки свържете се с колегите от техническа поддръжка за съдействие.