Безопасно ли изменять файл .htaccess в PHP?

#php #.htaccess

#php #.htaccess

Вопрос:

В моем файле .htaccess я использую переменные ( SetEnv ) для включения / выключения веб-сайта при выполнении обновлений, безопасно ли это или вообще возможно изменить этот файл .htaccess с помощью PHP-скрипта?

Чтобы быть более конкретным, мне нужно прокомментировать / отменить комментарий к этим строкам:

 #RewriteCond %{REMOTE_ADDR} !LOCALIPHERE
#RewriteCond %{REQUEST_URI} !^/Site/maintenance.htm
#RewriteCond %{REQUEST_URI} !^/Site/styles/style.css
#RewriteCond %{REQUEST_URI} !^/Site/includes/jquery-1.4.4.min.js
#RewriteCond %{REQUEST_URI} !.(jpg|jpeg|png|gif|swf)$
#RewriteRule ^.* /Site/maintenance.htm [L]
  

Спасибо

Редактировать:

Мое определение безопасности таково: я хотел бы знать, как будет вести себя сайт, если файл .htaccess открывается PHP-скриптом и веб-сайт посещается в одно и то же время.

Комментарии:

1. Тогда вам следует использовать атомарную запись file_put_contents(".htaccess", $settings, LOCK_EX) или еще лучше rename() . Таким образом, Apache будет перечитывать файл только тогда, когда он был написан полностью.

2. @mario 1, там хорошие советы, а также очень приятная информация. Если файл заблокирован, то все подключения ожидаются до тех пор, пока файл не будет выпущен, потому что файл .htaccess необходимо продолжить перед выполнением php. Я прав?

3. Просто помните, что ваш новый файл .htaccess должен быть идеальным. Любые синтаксические ошибки и весь ваш сайт будут недоступны, потому что Apache начнет выдавать 500 внутренних ошибок из-за неправильных директив в неработающем .htaccess

4. LOCK_EX будет иметь эффект, только если ваш Apache также прочитает его в режиме LOCK_SH. Я полагаю, что большинство версий делают это, но не проверял. Переименование было бы еще более атомарным для файловой системы. — Но да, .htaccess обрабатывается до вызова PHP.

Ответ №1:

Если файл доступен для записи с помощью процесса PHP, он может быть изменен, как и любой другой файл.

Однако вместо комментирования вашего кода вам следует использовать RewriteCond проверку вашего env var.

Комментарии:

1. Отличное решение. Могу ли я привести простой пример, если это возможно?

2. Смотрите httpd.apache.org/docs/2.0/mod/mod_rewrite.html#rewritecond — » %{ENV:variable} , где переменной может быть любая переменная среды, также доступна. Это просматривается через внутренние структуры Apache и (если там не найдено) через getenv() из серверного процесса Apache.»

Ответ №2:

Я бы оценил «безопасное изменение» в рамках рассмотрения, если это надежно сделать — без внесения синтаксических ошибок. Для достижения этой цели я бы рекомендовал вам использовать более конкретные маркеры комментариев:

 #<off>#RewriteCond %{RE...
  

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

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

Ответ №3:

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