#wordpress #apache #.htaccess
#wordpress #апач #.htaccess
Вопрос:
У меня есть сайт WordPress, где я предоставляю доступ пользователям через поставщика O2Auth, поэтому им никогда не нужно запрашивать wp-login.php
. Но когда пользователи выходят из системы, им необходимо запросить wp-login.php?action=logoutamp;_wpnounce=dead0beef
Я хочу защитить wp-login
через .htaccess, Require valid-user
Итак, могу ли я добавить Require
директиву, чтобы также разрешить action=logout
?
Я пробовал это делать, но безуспешно:
SetEnvIf Request_URI "o2a-login" o2a-user
...
Require env o2a_user
Require expr "(%{QUERY_STRING} =~ logout)"
Require expr "%{QUERY_STRING} in { 'action=logout(.*)', 'action=logout', '.*logout.*' }"
Require expr "%{QUERY_STRING} in {'wp-login.php?action=logout.*'}"
Или как альтернативный способ — могу ли я уважать пользователей, вошедших в систему wp, в Apache?
Комментарии:
1. Почему именно вы хотели использовать
Require
? Это не обязательно выглядит как подходящий инструмент для работы?2. Тогда подскажите мне лучшую альтернативу 🙂 Я не эксперт в этой области. Моя единственная цель — заблокировать скрипткидди и / или ботов
3. Но из того, что я видел, довольно ли часто таким образом ограничивают доступ к странице входа в систему
4. Да, вы правы, вы могли бы использовать mod_authz_core таким образом, чтобы ограничить доступ, хотя вам понадобятся дополнительные директивы, чтобы ограничить эти директивы запросами для
wp-login.php
(например.<Files>
), а не для всего сайта.
Ответ №1:
им необходимо запрашивать
wp-login.php?action=logoutamp;_wpnounce=dead0beef
Если вы просто хотите разрешить параметр action=logout
URL (в начале строки запроса) и заблокировать все остальные запросы wp-login.php
, вы можете использовать следующие директивы mod_rewrite перед фронт-контроллером WordPress, в верхней части .htaccess
файла:
RewriteCond %{QUERY_STRING} !^action=logout(?:amp;|$)
RewriteRule ^wp-login.php$ - [F]
В приведенных выше положениях для всех запросов /wp-login.php
, которые не имеют action=logout
в начале строки запроса, тогда отправка 403 запрещена.
Могу ли я уважать пользователей, зарегистрированных в wp, в Apache?
Вы не можете определить, действительно ли пользователь вошел в WP из .htaccess
. Вы можете проверить, установлен ли файл cookie, но вы не можете проверить подлинность значения этого файла cookie (с помощью сеанса WP), поэтому любой желающий потенциально может установить этот файл cookie.
Я хотел оставить wp-login открытым для входа в систему администратора без O2A вместо того, чтобы полностью блокировать его. Но я думаю, что я просто добавлю другую разрешенную строку запроса, чтобы выполнить эту работу.
Потенциально вы могли бы проверить наличие «частной» (известной только вам) строки запроса, чтобы, возможно, запутать логин.
Обновить:
Строка «запутывания» — это то, что я пробовал. Тогда я могу получить доступ к форме входа в систему, но действие «wp-login» перенаправляется обратно в URI без этой строки. Итак, после нажатия кнопки войти я перенаправляюсь на запрещенный сайт и не могу войти в систему
Возможно, вы могли бы установить файл cookie при передаче своего секретного ключа в URL-адресе и использовать этот файл cookie для фактической авторизации запроса (сохраняется перенаправление)? Например:
# Set Cookie if "secret key" successfully passed in the query string
# Remove secret key from query string (via 302 redirect)
RewriteCond %{QUERY_STRING} (.*)(?:^|amp;)(secret-name)=(secret-value)(amp;.*|$)
RewriteRule ^wp-login.php$ /$0?%1%4 [CO=%2:%3:example.com:0:/:secure:HttpOnly,R,L]
# Incorporate test if "secret key" cookie is present
RewriteCond %{QUERY_STRING} !^action=logout(?:amp;|$)
RewriteCond %{HTTP_COOKIE} !bsecret-name=secret-valueb
RewriteRule ^wp-login.php$ - [F]
%N
Обратные ссылки в строке RewriteRule
подстановки и аргументах flags ссылаются на захваченные подшаблоны в предыдущем CondPattern.
«Строка обфускации», т.е. secret-name=secret-value
pair, используется для установки cookie при перенаправлении. Таким образом, файл cookie может быть немедленно прочитан (и авторизован доступ) по перенаправленному запросу. Перенаправление также удаляет эту «строку обфускации» из видимой строки запроса.
Обратите внимание, что файл cookie сеанса устанавливается только для безопасных HTTPS-соединений и недоступен для JavaScript.
В качестве альтернативы, было бы безопаснее / проще авторизоваться по IP-адресу клиента, но если у вас динамический IP-адрес, это может быть непрактично. Например:
RewriteCond %{QUERY_STRING} !^action=logout(?:amp;|$)
RewriteCond %{REMOTE_ADDR} !=203.0.113.111
RewriteRule ^wp-login.php$ - [F]
203.0.113.111
это ваш внешний IP-адрес. Обратите внимание, что, поскольку мы используем =
префикс в CondPattern, это точное совпадение строк (не регулярное выражение), поэтому точки не нужно экранировать обратной косой чертой.
Комментарии:
1. Хорошо, теперь я понял вашу точку зрения. Я хотел оставить
wp-login
открытым для входа в систему администратора без O2A вместо того, чтобы полностью блокировать его. Но я думаю, что я просто добавлю другую разрешенную строку запроса, чтобы выполнить эту работу. Спасибо!2. Строка «запутывания» — это то, что я пробовал. Тогда я могу получить доступ к форме входа в систему, но действие «wp-login» перенаправляется обратно в URI без этой строки. Итак, после нажатия кнопки войти я перенаправляюсь на запрещенный сайт и не могу войти в систему
3. Вы можете использовать «строку обфускации» в строке запроса, чтобы установить файл cookie, который затем используется для авторизации запроса — по крайней мере, это будет сохраняться при перенаправлении. Я обновил свой ответ.
Ответ №2:
Хорошо, я не знаю, очень ли это хорошее решение, но оно работает для меня:
- Сначала я создал символическую ссылку в корне wp html (в основном /var/www/html/)
ln -s wp-login.php mySecretLogin.php
- Затем я добавил правила перезаписи, подобные предложенным @MrWhite, чтобы разрешить только выход из системы И
mySecretLogin
в качестве реферера - И
mySecretLogin
проверяется аутентификацией
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://mysite.tld/mySecretLogin(/|.php)$
RewriteCond %{QUERY_STRING} !^action=logout(amp;|$)
RewriteRule ^wp-login.php$ - [F]
</IfModule>
и
<FilesMatch "^mySecretLogin.php$">
AuthType Basic
AuthName "Password please!"
AuthUserFile /path/to/.htpasswd
Require valid-user
</FilesMatch>
Таким образом wp-login.php
, вход разрешен только для выхода из системы или mysite.tld/mySecretLogin.php
с помощью пароля.
Комментарии:
1. Кажется разумным решением, хотя я не вижу
mySecretLogin
, как устанавливается HTTPReferer
? Однако вам следует удалить<IfModule mod_rewrite.c>
оболочку — если mod_rewrite был каким-то образом отключен на вашем сервере, то ваша безопасность будет просто обойдена (вместо того, чтобы генерировать ошибку — что было бы предпочтительнее здесь).2. Маловероятно, что mod_rewrite будет отключен на моем сервере, поскольку я единственный человек с доступом к файловой системе, но я понимаю вашу точку зрения. Вы никогда не знаете 🙂 О реферере — это то, что я вижу в журналах; и это работает. Поскольку это файл, к которому я обращаюсь, хотя это символическая ссылка.