Защита PHP веб-серверов


31

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

Я ищу такие идеи, как:

Я обычно использую Linux, но не стесняйтесь предлагать решения и для Windows.

Ответы:


15
  1. Используйте директиву open_basedir, чтобы ограничить ваши скрипты PHP их домашним каталогом и возможными дополнительными каталогами приложений. Это очень эффективно само по себе.

  2. Используйте закаленный PHP, потому что это ничего не стоит, и это может помочь.

  3. Используйте suPHP, чтобы PHP-скрипты выполнялись как владелец файла (один пользователь на веб-сайт), и избегайте использования файлов с плохими разрешениями, таких как 777 ... suPHP также может позволить вам иметь php.ini для каждого веб-сайта, так что один сайт будет тупым требование не разрушать все.

  4. Mod_security - большой плюс, но его нужно хорошо использовать и настраивать.


Некоторым плохим сайтам действительно нужны register_globals и fopen, поэтому вы используете php.ini для каждого сайта с помощью suPHP. Один сайт может просто пойти на камикадзе, а другие будут (почти) совершенно безопасны.
Антуан Бенкемун

4
Если они используют register_globals и fopen, это говорит о том, что качество настолько плохое, что вы, возможно, захотите пересмотреть их использование :)
David Pashley

Если они платят 150 € / мес, вы не пересматриваете.
Антуан Бенкемун

3

По моему опыту, большинство уязвимостей на веб-сайте, основанном на PHP, являются результатом плохого (сайтного) дизайна, а не недостатков в самом PHP.

Несколько быстрых советов:

  • Универсальный фильтр ввода, выхода выхода. Пояснение: фильтр не означает escape, это означает, что «если я найду что-то подозрительное в этом пользовательском вводе, произойдет сбой отправки и скажу пользователю переформатировать».
  • Вместо того чтобы использовать escapeshellcmd (), просто не позволяйте вводить какие-либо пользовательские данные в оболочке . Это опасно и, вероятно, никогда не нужно.
  • Не вызывайте такие функции, как phpinfo () на производственном сайте (или, если вы это делаете, см. Ниже *).
  • При разработке веб-приложения всегда учитывайте, является ли это возможным вектором атаки? Скажем, SQL-инъекция. Если ответ «да», немедленно включите его - не говорите «хорошо, я добавлю это позже в процессе разработки в качестве функции». Безопасность никогда не является особенностью.
  • Никогда не выводите необработанные ошибки пользователю; это означает, что php.ini должен отображать display_errors = Off, log_errors = On. Улавливайте ошибки во время выполнения и выводите что-нибудь симпатичное. Возьмите кита Twitter в качестве примера: он не дает пользователю информацию об уровне отладки, он просто говорит: «Вупс, что-то сломалось, пожалуйста, обновите».

* Вы также можете заглянуть в короткий пост, который я написал под названием «Защита phpinfo (), что-то вроде», и обязательно прочитайте комментарии http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ Это была быстрая идея, я должен был (в некоторой степени) защитить phpinfo (), если я как-то забыл удалить его на производственном сайте.

В более общем смысле, некоторые разработчики пишут оболочки для чувствительных функций, которые проверяют, установлен ли флаг «производственный сайт» или нет, и отключают чувствительную функцию в производственном процессе.


Мой вопрос был больше о том, как защитить ваш сервер от плохо написанного PHP. :) Я не имел в виду, что сам по себе PHP был небезопасным, более того, он привлекает менее опытных разработчиков, и стандартная библиотека требует от них помнить, чтобы защищать каждый вызов, а не библиотеку, защищающую всех пользователей. +1, так как это очень полезный ответ.
Дэвид Пашли

Я получил это впечатление и ответил соответственно :) Спасибо за комментарий! Я не могу вникнуть во все это здесь, очевидно, но это большие ямы. Если у вас есть более конкретные вопросы, вы, несомненно, можете задать их в Переполнении стека, и я, и все остальные, внесем свой вклад. (И за что это стоит, я ZCE).
msanford

3

Другие параметры, которые должны быть изменены, чтобы укрепить PHP:

safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"

Сохраните все ошибки PHP в файле /var/log/phperror.log :

touch /var/log/phperror.log
chmod 666 /var/log/phperror.log

1

Я добавил репозитории dotdeb в мой /etc/apt/sources.lst

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

Поскольку они исправляют php / apache / mysql гораздо чаще, чем Debian.


1

Рассмотрите возможность настройки open_basedirна основе сайта. open_basedirэто настройка php.ini, которая запрещает вашим скриптам доступ к файлам вне определенного белого списка. Если на вашем сервере размещено несколько сайтов, один сайт не сможет прочитать настройки базы данных с другого сайта. Это также предотвратит доступ php-скрипта к основным системным файлам. Open basedir легко настроить, просто добавьте строку " php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list" к каждому Apache vhost.

Также рассмотрите возможность отключения механизма PHP-скриптов для всех сайтов / папок, которые не должны содержать PHP-скрипты (например, папка с загруженными изображениями). Опять же, это просто, добавьте «php_admin_value engine off» на любой виртуальный хост Apache, для которого не требуется php. Чтобы отключить PHP в каталоге, поместите то же самое в тег Directory.

Запускайте права доступа к файлам настолько жестко, насколько это возможно, избегайте доступа для записи к PHP-сценариям для пользователя Apache, это предотвращает изменение запущенного сценария или других сценариев на том же сайте / сервере. Избегайте разрешений 777, если это вообще возможно, выясните минимальные разрешения, необходимые для запуска приложения, и используйте их.

Если вы размещаете несколько сайтов, каждый со своей собственной базой данных, используйте для каждого отдельного пользователя MySQL / Postgres и установите разрешения для каждого пользователя таким образом, чтобы они имели доступ только к соответствующим базам данных. Опять же, это предотвратит несанкционированный доступ к базе данных другого приложения.

Suosin, HardenedPHP, mod_security и тому подобное также ценны, но используют их в дополнение к сильно заблокированной конфигурации, а не вместо.


0

Suhosin имеет довольно существенные эксплуатационные затраты, поэтому комментарий «ничего не стоит» немного не подходит.


2
Что хорошего в быстром взломанном сайте? :) hardened-php.net/suhosin/benchmark.html предлагает на 8,85% медленнее на одном тесте. Это может быть приемлемо для преимуществ безопасности, которые это обеспечивает. Вероятно, это должен был быть комментарий, а не ответ.
Дэвид Пашли

Сухосин защищает в первую очередь от локальных атак. Так что, если вы делитесь своим сервером с людьми, которым вы не доверяете, это может стоить замедления. Если у вас есть свой собственный сервер или собственный виртуальный слайс, я не вижу в этом смысла.

0

Вы ищете базовые предложения по брандмауэру / топологии? Мне нравится идея использовать такие вещи, как фунт, чтобы запретить доступ напрямую к веб-серверу PHP из немытых сетей. Таким образом, вы также можете отделить веб-сервер от других частей вашей сети.


Нет, я ищу способы улучшить безопасность среды выполнения PHP.
Дэвид Пашли

0

Использование Suhosin / mod_security / SuPHP определенно сделает ваш PHP-сервер безопасным. Отключение определенных функций, таких как exec, passthru, system и escapeshellcmd, также очень поможет.


1
Разве escapeshellcmd () не используется только для экранирования строки? Это не обеспечивает способ выполнения процесса. Как кто-то может использовать это, чтобы вызвать проблему?
Дэвид Пашли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.