Содержание

Принудительный вход через HTTPS

Плагины

forcessllogin

См. https://www.dokuwiki.org/plugin:forcessllogin, похоже, не отражает доступ SSL в URL , т.е. страница «Докувики», доступ к которой запрещен, не будет открыта по протоколу https, что затрудняет отладку и обеспечение безопасного входа в систему.

Апачи

Используя mod_rewrite Apache, можно принудительно использовать HTTPS для входа в DokuWiki, тем самым предотвращая передачу паролей в открытом виде.

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

.htaccess
RewriteCond %{HTTPS} !on
RewriteRule (.*) https://%{HTTP_HOST}/$1 [R,L]

Если вы хотите принудительно задать только какой-то определенный URL , сначала прочтите статью о перезаписи URL.

Перенаправление на защищенное соединение, которое ограничено определенным набором страниц (например, страницы входа), требует их распознавания на основе URL . Некоторые страницы (например, страницы «доступ запрещен», которые могут быть включены только в более новых версиях, например, 2014-05-05 «Ponder Stibbons» <ref> https://www.dokuwiki.org/plugin:ondeniedlogin </ref>) не включают такую ​​метку и не могут быть отделены от остальных URL (к которым может потребоваться доступ без защищенного соединения для экономии ресурсов сервера).

FIXME Остальная часть параграфа обрабатывает только запросы с ?do=login запросом GET, который не охватывает по крайней мере страницы «доступ запрещен»! Необходимо исследование правила перенаправления для всех запросов аутентификации по HTTP. Смотрите обсуждение для решения.

Далее предполагается, что вы уже настроили поддержку HTTPS для своей вики, сделав ее доступной по HTTP и HTTPS по одному и тому же адресу. По соображениям производительности только вход в систему и обновления профиля должны быть принудительно переведены на HTTPS, в то время как все «нормальные» действия вики будут продолжать работать по HTTP.

Поскольку вам необходимо настроить куки через HTTPS для работы на HTTP, вам необходимо сначала отключить опцию securecookie . Затем приступайте к настройке перенаправления в вашем .htaccess:

# Переключиться на безопасный режим при входе в систему, профиле и действиях администратора 
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteCond %{QUERY_STRING} do=(log|profile|admin)
RewriteRule ^(.*) https://%{HTTP_HOST}/$1 [R,QSA,L,NE]
 
# Изменить обратно на небезопасный режим при показе действия 
RewriteCond %{HTTPS} on
RewriteCond %{QUERY_STRING} !do=(log|profile|admin)
RewriteCond %{REQUEST_METHOD} GET
RewriteRule ^(.*) http://%{HTTP_HOST}/$1 [R,QSA,L]

Возможно, вы захотите изменить ${HTTP_HOST} его на ${SERVER_NAME}, где имя сервера совпадает с именем хоста в вашем SSL-сертификате.

Примечания:

Обратите внимание: вам необходимо отключить « securecookie », conf/dokuwiki.php чтобы приведенный выше код работал. В противном случае ваши входы не будут успешно регистрироваться. Это происходит потому, что при включенном securecookie сеансовый cookie, созданный во время входа HTTPS, не может быть отправлен по HTTP, и сеанс теряется.

nginx

Такая настройка также возможна в nginx, но с небольшой доработкой fastcgi_params.

Во-первых, вам нужно иметь отдельные экземпляры сервера, для http и https каждый, чтобы поддерживать чистоту (и rewrite не запутаться и не попасть в ловушку redir loops). Это может выглядеть так. Каждый экземпляр имеет свое собственное правило перезаписи для переключения с http на https.

# Протестировано с nginx 0.8.5
# В http-контексте вашей конфигурации nginx
map $scheme $php_https { default off; https on; }
 
    server {
	server_name wiki.host.org
	root /path/to/dokuwiki;
	index doku.php;
	listen 80;
	#Enforce https for logins, admin
	if ($args ~* do=(log|admin|profile)) {
		rewrite ^ https://$host$request_uri? redirect;
	}
	include dokuwiki.conf;
    }
 
    server {
	server_name wiki.host.org;
	root /path/to/dokuwiki;
	index doku.php;
	listen 443 ssl;
	keepalive_requests    10;
	keepalive_timeout     60 60;
	ssl_certificate      /etc/ssl/certs/ssl-cert-snakeoil.pem;
	ssl_certificate_key  /etc/ssl/private/ssl-cert-snakeoil.key;
	#switch back to plain http for normal view
 
	if ($args ~* (do=show|^$)){
		rewrite ^ http://$host$request_uri? redirect;
	}
	include dokuwiki.conf;
    }

В dokuwiki.conf (тот же путь, что и у вашего nginx.conf) вы можете использовать фрагмент из вики nginx, но вам нужно добавить

fastcgi_param HTTPS $php_https;

в ваш fastcgi_params. Этот параметр и map директива в начале обязательны, поскольку Dokuwiki проверяет $_SERVER['HTTPS'] для работы.

Как и в случае с Apache, вам необходимо отключить Securecookie в вашем conf/dokuwiki.php.

HTTPS на основе PHP

Ниже полезно, если вы хотите принудительно использовать https-соединение ВСЕГДА (не только для входа) и не хотите полагаться на Apache или NGINX htaccess или другие специфичные для сервера директивы. Поместите следующие строки в начало файла шаблона в '…lib/tpl/template-name/main.php'

<?php
if ($_SERVER[HTTPS]!="on") {
  //$strURIName=$_SERVER['SERVER_NAME'] . getenv("REQUEST_URI"); 
  // Функция 'getenv' не работает, если ваш API сервера - ASAPI (IIS). 
  // Поэтому постарайтесь использовать не getenv('REMOTE_ADDR'), а $_SERVER["REMOTE_ADDR"].
  $strURIName= $_SERVER['SERVER_NAME'] . $_SERVER['REQUEST_URI'];
  header ("Location: https://$strURIName");
  // Если это не работает для вас и вам нужно устранить неполадки в вашем PHP-коде, 
  // раскомментируйте ниже, чтобы узнать о ваших конкретных переменных сервера 
  /*
  echo "<b>_SERVER Variables from $_SERVER</b><br><br>";
  reset($_SERVER);
  while (list ($key, $val) = each ($_SERVER)) {
  print $key . " = " . $val . "<br>";
  }
  */
}
?>

Спасибо. Это спасло мой день!

Обсуждение