Intereting Posts
Ограничить редактирование / удаление почты на основе идентификатора пользователя и настраиваемого поля Для загрузки страницы требуется конечный «/» Почему «date_query» не работает в «pre_get_posts»? Интеграция jQuery Datatables с редактором в wordpress admin Child Theme: как переопределить переменные? Один пост из более чем двадцати показывает нечетное изображение (из сообщения) в заголовке Гравитационные формы пользовательских шаблонов Проверьте, не имеет ли конкретный цикл меньше определенного количества сообщений Загрузить шаблон comment.php вне цикла post Исходное смещение количества сообщений на главной странице на странице сообщений если плагин активен? проверить, включен ли плагин или нет? Категории и теги не работают! Как отлаживать модульный тест для плагина WordPress, который использует WordPress-тест? Где найти код, используемый для визуализации страницы с коротким кодом и определенным шаблоном? Передача условных массивов в WP_Query ()

Действительно ли перемещение wp-config вне веб-корня действительно выгодно?

В наши дни одним из наиболее распространенных методов безопасности является перемещение wp-config.php одну директорию выше, чем у корневого документа в стиле vhost . Я никогда не нашел для этого хорошего объяснения, но я предполагаю, что это сводит к минимуму риск того, что вредоносный или зараженный скрипт внутри webroot будет читать пароль базы данных.

Но вы все равно должны позволить WordPress получить к нему доступ, поэтому вам нужно расширить open_basedir чтобы включить каталог выше корня документа. Разве это не просто побеждает всю цель, а также потенциально подвергает злоумышленников журналы сервера, резервные копии и т. Д.?

Или это метод, который пытается предотвратить ситуацию, когда wp-config.php будет отображаться как простой текст любому, кто запрашивает http://example.com/wp-config.php , а не анализируется движком PHP? Это кажется очень редким случаем, и это не перевешивает недостатки в экспонировании журналов / резервных копий / etc для HTTP-запросов.

Может быть, можно переместить его за пределы корня документа в некоторых настройках хостинга, не подвергая другим файлам, но не в других настройках?


Вывод: после многого назад и вперед по этому вопросу появились два ответа, которые, я думаю, следует считать авторитетными. Аарон Адамс делает хороший аргумент в пользу перехода wp-config, и chrisguitarguy делает хороший аргумент против него. Это два ответа, которые вы должны прочитать, если вы новичок в потоке и не хотите читать все. Другие ответы являются либо избыточными, либо неточными.

Solutions Collecting From Web of "Действительно ли перемещение wp-config вне веб-корня действительно выгодно?"

Короткий ответ: да

Ответ на этот вопрос однозначно «да» , и сказать иначе совершенно безответственно .


Длинный ответ: реальный пример

Позвольте мне представить очень реальный пример, с моего самого реального сервера, где перемещение wp-config.php за пределами веб-корня специально предотвратило его содержимое .

Баг:

Взгляните на это описание ошибки в Plesk (исправлено в 11.0.9 MU # 27):

Plesk сбрасывает субдоменную пересылку после синхронизации подписки с планом хостинга (117199)

Звучит безобидно, не так ли?

Ну, вот что я сделал, чтобы вызвать эту ошибку:

  1. Настройте субдомен для перенаправления на другой URL (например, site.staging.server.com на сайт- site-staging.ssl.server.com ).
  2. Изменен тарифный план подписки (например, его конфигурация PHP).

Когда я это сделал, Plesk сбрасывает субдомен по умолчанию: обслуживает содержимое ~/httpdocs/ , без каких-либо интерпретаторов (например, PHP).

И я не заметил. Неделями.

Результат:

  • С wp-config.php в корневом /wp-config.php веб-сайта запрос /wp-config.php бы файл конфигурации WordPress.
  • С wp-config.php за пределами веб-корня запрос /wp-config.php загрузил полностью безопасный файл. Не удалось загрузить реальный файл wp-config.php .

Таким образом, очевидно, что перемещение wp-config.php за пределами корня веб-сайта имеет добросовестные преимущества безопасности в реальном мире .


Как переместить wp-config.php в любое место на вашем сервере

WordPress автоматически будет искать один каталог над установкой WordPress для вашего файла wp-config.php , поэтому, если вы его переместили, все готово!

Но что, если вы переместили его в другое место? Легко. Создайте новый wp-config.php в каталоге WordPress со следующим кодом:

 <?php /** Absolute path to the WordPress directory. */ if ( !defined('ABSPATH') ) define('ABSPATH', dirname(__FILE__) . '/'); /** Location of your WordPress configuration. */ require_once(ABSPATH . '../phpdocs/wp-config.php'); 

(Обязательно измените приведенный выше путь на фактический путь вашего перенесенного файла wp-config.php .)

Если у вас возникла проблема с open_basedir , просто добавьте новый путь в директиву open_basedir в вашей конфигурации PHP:

 open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/" 

Это оно!


Выбирать аргументы против

Каждый аргумент против перемещения wp-config.php за пределами корня веб-сайта зависит от ложных предположений.

Аргумент 1: Если PHP отключен, они уже находятся в

Единственный способ увидеть, что содержимое [ wp-config.php ] – это то, что они обойдут ваш сервер PHP-интерпретатор … Если это произойдет, у вас уже проблемы: у них есть прямой доступ к вашему серверу.

ЛОЖЬ : сценарий, описанный выше, является результатом неправильной конфигурации, а не вторжения.

Аргумент 2: Случайное отключение PHP редко, и поэтому незначительно

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

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

WTF : Изменение пароля после вторжения вряд ли помогает, если во время вторжения была получена чувствительная информация. Действительно, мы все еще думаем, что WordPress используется только для случайного ведения блога, и что нападавших интересует только искажение? Давайте позаботимся о защите нашего сервера, а не просто восстановим его после того, как кто-то войдет.

Аргумент 3: Отказ от доступа к wp-config.php достаточно хорош

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

FALSE : Представьте себе, что ваши настройки по умолчанию для виртуального хоста: нет PHP, нет .htaccess , allow from all (вряд ли необычно в производственной среде). Если ваша конфигурация каким-то образом сбрасывается во время обычной операции – например, обновление панели – все вернется к состоянию по умолчанию, и вы будете открыты.

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

WTF : Почему кто-то конкретно рекомендует меньше уровней безопасности? Дорогие автомобили имеют не только замки; у них также есть аварийные сигналы, иммобилайзеры и GPS-трекеры. Если что-то стоит защитить, сделайте это правильно.

Аргумент 4: Несанкционированный доступ к wp-config.php не имеет большого значения

Информация о базе данных – действительно единственный чувствительный материал в [ wp-config.php ].

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

WTF : Даже если учетные данные базы данных были единственной вещью в wp-config.php , вы должны быть в ужасе от того, что злоумышленник получил их.

Аргумент 5: Перемещение wp-config.php за пределы корня веб-сервера фактически делает сервер менее безопасным

Вы все еще должны позволить WordPress получить доступ к [ wp-config.php ], поэтому вам нужно расширить open_basedir чтобы включить каталог выше корня документа.

FALSE : Предполагая, что wp-config.php находится в httpdocs/ , просто переместите его в ../phpdocs/ и установите open_basedir для включения только httpdocs/ и phpdocs/ . Например:

 open_basedir = "/var/www/vhosts/example.com/httpdocs/;/var/www/vhosts/example.com/phpdocs/;/tmp/" 

(Не забудьте всегда включать /tmp/ или ваш пользовательский каталог tmp/ , если он у вас есть.)


Вывод: файлы конфигурации всегда должны всегда находиться за пределами веб-корня

Если вы заботитесь о безопасности, вы переместите wp-config.php за пределы вашего веб-корня.

Самое главное, что wp-config.php содержит некоторую конфиденциальную информацию: имя пользователя / пароль вашей базы данных и т. Д.

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

Однако вот что: wp-config.php никогда ничего не выводит на экран. Он определяет только различные константы, используемые во время установки WP. Таким образом, единственный способ увидеть содержимое этого файла, если они обойдут ваш сервер PHP-интерпретатор – они получают .php файл для рендеринга как простой текст. Если это произойдет, у вас уже проблемы: у них есть прямой доступ к вашему серверу (и, возможно, права root), и он может делать все, что им нравится.

Я собираюсь пойти дальше и сказать, что нет никакой пользы для перемещения wp-config вне корня документа с точки зрения безопасности – по причинам выше и следующим:

  1. Вы можете ограничить доступ к файлу через вашу конфигурацию виртуального хоста или .htaccess – эффективно ограничивая внешний доступ к файлу таким же образом, что перемещение за пределы корня документа было бы
  2. Вы можете гарантировать, что права доступа к файлам строго указаны в wp-config чтобы любой пользователь без достаточных привилегий не читал файл, даже если он получает (ограниченный) доступ к вашему серверу через SSH.
  3. Ваша конфиденциальная информация, настройки базы данных, используются только на одном сайте. Таким образом, даже если злоумышленник получил доступ к этой информации, единственным сайтом, на который он повлиял бы, будет установка WordPress, к которой принадлежит файл wp-config.php . Что еще более важно, у этого пользователя базы данных есть только разрешения на чтение и запись в эту базу данных установки WP, а ничего больше – нет доступа к разрешениям других пользователей. С другой стороны, если злоумышленник получает доступ к вашей базе данных, это просто вопрос восстановления из резервной копии (см. Пункт 4) и изменение пользователя базы данных
  4. Вы часто делаете резервное копирование Часто относительный термин: если вы отправляете 20 статей каждый день, вам лучше делать резервные копии каждый день или каждые несколько дней. Если вы отправляете сообщение один раз в неделю, резервное копирование один раз в неделю, вероятно, достаточно.
  5. У вас есть сайт под управлением версиями ( например, это ), что означает, что даже если злоумышленник получил доступ, вы можете легко обнаружить изменения кода и отбросить их назад. Если злоумышленник имеет доступ к wp-config , они, вероятно, испортили что-то еще.
  6. Информация о базе данных на самом деле является единственным чувствительным материалом в wp-config , и потому что вы осторожны в этом (см. Пункты 3 и 4), это не огромная сделка. Соли и т. Д. Могут быть изменены в любое время. Единственное, что происходит, это то, что он недействителен для входа в файлы cookie пользователей.

Для меня, перемещение wp-config из корня документа пахнет безопасностью безвестностью – это очень соломенный человек.

Я думаю, что Макс – это хорошо осведомленный ответ, и это одна сторона истории. В коде WordPress больше рекомендаций :

Кроме того, убедитесь, что только вы (и веб-сервер) можете прочитать этот файл (обычно это означает разрешение 400 или 440).

Если вы используете сервер с .htaccess, вы можете поместить его в этот файл (на самом верху), чтобы запретить доступ к любому серфингу для него:

 <files wp-config.php> order allow,deny deny from all </files> 

Обратите внимание, что установка разрешения 400 или 440 на wp-config.php может запретить плагинам писать или изменять его. Например, подлинный пример – кэширование плагинов (W3 Total Cache, WP Super Cache и т. Д.). В этом случае я бы пошел с 600 (разрешение по умолчанию для файлов в каталоге /home/user ).

Кто-то попросил нас сиять, и я отвечу здесь.

Да, есть преимущества безопасности от изоляции вашего wp-config.php от корневого каталога вашего сайта.

1- Если ваш обработчик PHP каким-либо образом сломается или изменен, ваша информация о DB не будет отображаться. И да, я видел, как это произошло несколько раз на общих хостах во время обновлений сервера. Да, сайт будет разбит в течение этого периода, но ваши пароли будут неповрежденными.

2- Лучшие практики всегда рекомендуют изолировать файлы конфигурации от файлов данных. Да, это трудно сделать с помощью WordPress (или любого веб-приложения), но его перемещение немного изолирует.

3- Помните уязвимость PHP-CGI, где любой может передать? -s в файл и просмотреть источник. http://www.kb.cert.org/vuls/id/520827

В конце концов, это небольшие детали, но они помогают минимизировать риск. Специально, если вы находитесь в общей среде, где каждый может получить доступ к вашей базе данных (все, что им нужно, это пользователь / пропуск).

Но не позволяйте малым отвлечениям (преждевременным оптимизациям) перед тем, что действительно необходимо для правильной защиты сайта:

1- Постоянно обновляйте

2- Использовать надежные пароли

3- Ограничить доступ (через разрешения). У нас есть сообщение об этом здесь:

http://blog.sucuri.net/2012/08/wordpress-security-cutting-through-the-bs.html

благодаря,

Определенно да.

Когда вы перемещаете wp-config.php за пределами общедоступного каталога, вы защищаете его от чтения с помощью браузера, когда злоумышленник php-злоумышленник получает злонамеренно (или случайно!).

Чтение вашего логина / пароля в БД возможно, когда сервер вряд ли заражен по ошибке администратора. Поручите администратору штраф и получите более надежный и надежный серверный хост. Хотя это может быть дороже.

Я просто хочу пояснить, ради аргумента, что перемещение вашего файла wp_config.php не обязательно означает, что вы должны переместить его только в родительский каталог. Допустим, у вас есть такая структура, как / root / html, где html содержит установку WP и весь ваш HTML-контент. Вместо перемещения wp_config.php в / root вы можете перенести его на нечто вроде / root / secure …, которое находится вне каталога html, а также не в корневом каталоге сервера. Конечно, вам нужно будет убедиться, что php также может работать в этой безопасной папке.

Поскольку WP не может быть настроен на поиск wp_config.php в папке для сиблинга, такой как / root / secure, вам нужно сделать дополнительный шаг. Я оставил wp_config.php в / root / html и вырезал чувствительные части (логин базы данных, соль, префикс таблицы) и переместил их в отдельный файл config.php. Затем вы добавляете команду include PHP в свой wp_config.php, например: include('/home/content/path/to/root/secure/config.php');

Это, по сути, то, что я сделал в своей настройке. Теперь, основываясь на приведенном выше обсуждении, я все еще оцениваю, нужна ли это или даже хорошая идея. Но я просто хотел добавить, что приведенная выше конфигурация возможна. Он не раскрывает ваши резервные копии и другие корневые файлы, и пока защищенная папка не настроена с собственным общедоступным URL-адресом, она не просматривается.

Кроме того, вы можете ограничить доступ к защищенной папке, создав там файл .htaccess с:

 order deny,allow deny from all allow from 127.0.0.1 

Есть много плохих письменных тем и плагинов, которые позволяют атакерам вводить код (помните о проблеме безопасности с Timthumb). Если бы я был злоумышленником, зачем искать wp-config.php? Просто введите этот код:

 var_dump( DB_NAME, DB_USER, DB_PASSWORD ); 

Вы можете скрыть свой wp-config.php. Пока WordPress делает всю конфиденциальную информацию глобальной доступной, у нее нет никакой пользы, чтобы скрыть wp-config.php.

Плохая часть в wp-config.php заключается не в том, что она содержит конфиденциальные данные. Плохая часть состоит в том, чтобы определить чувствительные данные как глобальную доступную константу.

Обновить

Я хочу уточнить проблемы с define() и почему это плохая идея для определения конфиденциальных данных как глобальной константы.

Существует множество способов атаковать веб-сайт. Вставка скрипта – это только один способ атаковать веб-сайт.

Предполагая, что у сервера есть уязвимость, позволяющая злоумышленнику получить доступ к дампу памяти. Злоумышленник найдет в памяти дамп все значения всех переменных. Если вы определяете глобальную доступную константу, она должна оставаться в памяти до тех пор, пока скрипт не закончится. Создавая переменную вместо константы, есть хорошая вероятность, что сборщик мусора перезапишет (или освободит) память после того, как переменная больше не понадобится.

Лучшим способом защиты конфиденциальных данных является их удаление сразу после его использования:

 $db_con = new stdClass(); $db_con->db_user = 'username'; $db_con->password = 'password'; $db_con->host = 'localhost'; $db_handler = new Database_Handler( $db_con ); $db_con = null; 

После использования конфиденциальных данных присвоение null значению перезапишет данные в памяти. Злоумышленник должен получить дамп памяти только в тот момент, когда $db_con содержит конфиденциальные данные. И это очень короткое время в приведенном выше примере (если класс Database_Handler не сохраняет его копию).

Помимо преимуществ безопасности, он также позволяет вам поддерживать экземпляр WordPress под управлением версии, сохраняя основные файлы WordPress как подмодуль / внешний. Именно так Марк Джекит настроил свой проект WordPress-Skeleton. Подробнее см. https://github.com/markjaquith/WordPress-Skeleton#assumptions .