Беззащитный info php. Проверенные способы защиты PHP




PHP - это один из самых популярных серверных языков программирования с открытым исходным кодом. Он используется не только для создания сайтов, но и в качестве языка программирования общего назначения, а также для написания серверной части различных веб-приложений.

Выполнять скрипты на PHP могут веб-серверы Apache, Nginx и Lighttpd. Также PHP может выполняться интерпретатором прямо из командной строки. Но поскольку PHP установлен на сервере, он может создать ряд проблем с безопасностью, поэтому его нужно применять осторожно.

Все программы содержат уязвимости и PHP не исключение. В этой статье мы собрали советы, которые помогут вам поддерживать безопасность в PHP, а следовательно, безопасность вашего сервера на высшем уровне.

Все приведенные ниже советы рассчитаны на то, что PHP работает под управлением Nginx или Apache, сам интерпретатор PHP недоступен из внешней сети. А теперь, перейдем к рассмотрению того как выполняется защита php кода, сайта и сервера в целом.

1. Знайте врага в лицо

Приложения на основе PHP могут подвергаться различным типам атак, вот основные из них:

  • XSS - это уязвимость в веб-приложениях, с помощью которой злоумышленники могут выполнять произвольный JavaScript код в браузере пользователей, и таким образом, украсть его данные. Возникает из-за отсутствия проверки на данных в скриптах на правильность;
  • SQL инъекция - это уязвимость в коде работы с базой данных. Если пользовательский ввод неверно фильтруется скриптом, и используется для формирования запроса к базе данных, то злоумышленники могут выполнить любые запросы к базе данных. Для предотвращения такой проблемы рекомендуется фильтровать данные функцией mysql_real_escape_string() перед отправкой запроса;
  • - позволяет посетителю загружать файлы на ваш сервер. Загрузив определенный тип файлов, пользователи могут получить доступ к системе или даже украсть информацию из базы данных, поэтому нужно следить чтобы можно было загружать только картинки;
  • Удаленное выполнение - злоумышленник может удаленно выполнять php файлы, которые есть на сервере, поэтому вместе с возможностью загрузки PHP файлов это представляет серьезную опасность;
  • Eval() - позволяет выполнить код PHP, переданный в строке, часто используется злоумышленниками, чтобы скрыть свой код на вашем сервере;
  • CSRF атака - позволяет заставить пользователя выполнить нежелательные действия в веб-приложениях. Если пользователь является администратором, это может поставить под угрозу все приложение.
2. Используйте только необходимые модули

Чтобы посмотреть все скомпилированные модули PHP выполните команду:

Рекомендуется использовать только самые необходимые модули, чтобы увеличить безопасность. Например, вы можете отключить модуль sqlite. Для этого можно удалить его конфигурационный файл в /etc/php5/conf.d/. Но для полного удаления нужно пересобрать PHP без этого модуля.

3. Избегайте утечек информации

В конфигурационном файле php.ini есть строчка:

expose_php = Off

Если установлено значение On, то PHP будет отправлять версию PHP в ответ на все запросы в заголовке X-Powered-By. Также рекомендуется скрыть версию Apache и другую информацию. Защита php от взлома, это не только аккуратное программирование, но и сокрытие информации о системе.

4. Отключите динамические расширения

PHP поддерживает динамическую загрузку расширений. По умолчанию загружаются все расширения, конфигурационные файлы которых есть в /etc/php/conf.d/. Также загружаются модули, которые указаны директивой extension в основном конфиге php.ini. Мы можете удалить ненужное.

5. Вывод ошибок

Сообщения об ошибках содержат много информации, не позволяйте их смотреть всем пользователям сайта. Приведите директиву display_errors к такому виду:

display_errors = Off

Убедитесь, что вы сохраняете все ошибки в лог файл:

log_errors = On
error_log = /var/log/httpd/php_scripts_error.log

6. Запретите загрузку файлов

file_uploads = Off

Но если такая функция необходима, то лучше ограничить размер файла:

file_uploads = On
upload_max_filesize = 1M

Пользователи смогут загружать файлы размером не более 1 мегабайт, так безопасность в php будет больше.

6. Отключите удаленное выполнение кода

Если параметр allow_url_fopen включен, php может использовать такие файловые функции, как file_get_contents . С помощью нее скрипт может загружать файлы из удаленных серверов. Программисты часто забывают выполнить надлежащую фильтрацию данных, и тем самым открывают уязвимость. Для отключения измените директиву:

allow_url_include = Off

7. Включите безопасный режим SQL

В безопасном режиме SQL, интерпретатор игнорирует все аргументы, передаваемые в функции mysql_connect и mysql_pcconnect. Но в таком режиме будут работать не все скрипты, например, не будет работать WordPress, так что используйте аккуратно. Для включения добавьте директиву:

magic_quotes_gpc=Off

9. Контролируйте размер POST

Метод POST используется, когда браузер хочет передать веб-серверу определенное количество данных как часть запроса, например, при загрузке файла. Злоумышленники могут использовать большие запросы, чтобы истратить ресурсы сервера. Поэтому размер лучше ограничить:

post_max_size=1K

10. Контролируйте ресурсы

Вы можете указать максимальное время выполнения для каждого скрипта, максимальное количество памяти и максимальное время чтения данных, это увеличит безопасность сайта php в плане DOS атак:

max_execution_time = 30
max_input_time = 30
memory_limit = 40M

11. Отключите опасные функции

PHP содержит множество функций, которые могут использоваться для взлома сервера, например, те, которые позволяют выполнять команды оболочки. Чтобы отключить, достаточно их перечислить в директиве disable_functions:

disable_functions =exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source

12. Настройте Fastcgi для лучшей безопасности

PHP может работать через FastCGI, это уменьшает использование памяти вашего веб-сервера. Нужно включить директиву force_redirect чтобы предотвратить прямое выполнение php скриптов из строки запроса, например, cgi-bin/php/hackerdir/backdoor.php. Для этого добавьте:

cgi.force_redirect=On

13. UID и GID интерпретатора PHP

Если вы используете внешний FastCGI сервер, то нужно чтобы он был запущен не от пользователя root. Запускайте php от имени непривелигированного пользователя. Как вы знаете, у PHP есть функции, которые позволяют выполнять команды оболочки. Очень небезопасно, если они будут выполняться от суперпользователя.

14. Ограничение доступа к файловой системе

Директива open_basedir позволяет установить каталог, в котором php может получить доступ к файлам с помощью таких функций, как fopen, file_get_contents и т д. Если файл находится вне этой директории PHP откажется его открывать. Вы даже не сможете использовать символические ссылки.

open_basedir = "/var/www/html/"

15. Путь для хранения сессий

Нужна не только защита php сайта, чтобы скрипты не смогли причинить вред системе, но и чтобы пользователи не могли получить доступ к файлам php. Сессии в php позволяют сохранить определенную информацию между обращениями пользователя. Путь, где будет храниться эта информация указан в файле /etc/php/php.ini. Убедитесь, что этот путь находится вне /var/www/ и недоступен для чтения или записи для других пользователей системы.

upload_tmp_dir = "/var/lib/php/session"

16. Держите программное обеспечение в актуальном состоянии

Все программы могут содержать различные уязвимости, поэтому важно выполнять регулярное обновление системы, чтобы вовремя применить все патчи безопасности. Нужно обновлять не только PHP, а весь программный стек, в том числе Apache.

17. Используйте SELinux

SELinux - это система безопасности, используемая по умолчанию в RedHat. Ее можно использовать для предотвращения несанкционированного доступа к файлам и ресурсам. Например, вы можете установить политики безопасности для веб-сервера Apache или отдельного сервера PHP. Это тоже отличная защита PHP и не только.

18. Установите mod_security

Это модуль Apache для обнаружения и предотвращения в веб-приложения. Он может защитить php и ваше приложение от XSS и SQL-Inj атак. Например, чтобы не позволять открывать файлы в /etc/ после установки модуля добавьте в конфигурационный файл Apache:

А для предотвращения SQL инъекций:

SecFilter "delete[[:space:]]+from"
SecFilter "select.+from"

19. Просматривайте журналы

Регулярно просматривайте файлы журналов Apache и PHP, вы сможете получить некоторые представление о том, как работает сервер и проверить уровень безопасности.

tail -f /var/log/httpd/error_log
$ tail -f /var/log/httpd/php_scripts_error.log

Выводы

В этой статье мы рассмотрели несколько способов увеличить безопасность сайта PHP. Они помогут вам держать свой сервер в максимальной безопасности. Возможно, это не все доступные варианты, если вы знаете другие способы, напишите в комментариях.

На завершение лекция про безопасность написания скриптов в PHP:

Получает внешний фид и разбирает его на данные (парсит его).

Функция нужна, чтобы получить RSS фид в виде SimplePie объекта и закэшировать результат.

Для получения и парсинга фида fetch_feed() использует популярный класс SimplePie . Фид кэшируется и кэш в последствии обновляется каждые 12 часов.

Данные кэшируются в базу данных во временные опции . Если установлен плагин постоянного объектного кэширования, то функция будет кэшировать не в БД, а в хранилище для объектного кэша.

Возвращает

SimplePie/WP_Error. SimplePie объект данных о фиде или объект WP_Error в случае ошибки.

Использование $feed = fetch_feed($uri); $uri(строка) (обязательный) Ссылка (УРЛ) на фид который нужно получить. В результате по этой ссылке будет получен создан объект (массив) SimplePie.
По умолчанию: нет Примеры #1. Получим последние 5 записей из фида у внешнего сайта

Пример, который получает и выводит на экран ссылки на существующий RSS фид. В примере мы ограничиваем вывод только 5-ю последними записями в фиде.

Поcледние новости с блога blog.ru