[英]htaccess only allow specific php query
我有一個 WordPress 網站,我通過 O2Auth 提供商向用戶授予訪問權限,因此他們永遠不必查詢wp-login.php
。 但是,當用戶注銷時,他們需要查詢wp-login.php?action=logout&_wpnounce=dead0beef
我想通過 .htaccess 保護wp-login
, 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.*'}"
或者作為替代方式 - 我可以尊重 Apache 的 wp 登錄用戶嗎?
他們需要查詢
wp-login.php?action=logout&_wpnounce=dead0beef
如果您只想允許action=logout
URL 參數(在查詢字符串的開頭)並阻止對wp-login.php
所有其他請求,那么您可以在靠近頂部的 WordPress 前端控制器之前使用以下 mod_rewrite 指令.htaccess
文件:
RewriteCond %{QUERY_STRING} !^action=logout(?:&|$)
RewriteRule ^wp-login\.php$ - [F]
上述狀態,對於所有在查詢字符串開頭沒有action=logout
/wp-login.php
請求,然后發送 403 Forbidden。
我可以尊重 Apache 的 wp 登錄用戶嗎?
您無法確定用戶是否實際從.htaccess
登錄到 WP。 您可以檢查是否設置了 cookie,但您無法驗證該 cookie 的值(使用 WP 會話) - 因此任何人都可能設置該 cookie。
我想讓 wp-login 在沒有 O2A 的情況下為管理員登錄打開,而不是完全阻止它。 但我想我只會添加一個允許的查詢字符串來完成這項工作。
您可以潛在地檢查“私有”(只有您知道)查詢字符串以混淆登錄。
更新:
“混淆”字符串是我嘗試過的。 然后我可以訪問登錄表單,但是“wp-login”操作重定向回沒有這個字符串的 URI。 所以按下登錄后,我被重定向到禁止的站點並且無法登錄
您也許可以在 URL 中傳遞您的密鑰時設置一個 cookie,並使用此 cookie 來實際授權請求(幸免於重定向)? 例如:
# Set Cookie if "secret key" successfully passed in the query string
# Remove secret key from query string (via 302 redirect)
RewriteCond %{QUERY_STRING} (.*)(?:^|&)(secret-name)=(secret-value)(&.*|$)
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(?:&|$)
RewriteCond %{HTTP_COOKIE} !\bsecret-name=secret-value\b
RewriteRule ^wp-login\.php$ - [F]
RewriteRule
替換字符串和標志參數中的%N
反向引用指的是前面CondPattern 中捕獲的子模式。
“混淆字符串”,即。 secret-name=secret-value
對,用於在重定向時設置 cookie。 因此可以在重定向的請求上立即讀取 cookie(並授權訪問)。 重定向還會從可見查詢字符串中刪除此“混淆字符串”。
請注意,會話cookie 僅在安全HTTPS 連接上設置,並且不適用於 JavaScript。
或者,通過客戶端 IP 地址授權會更安全/更容易,但如果您有一個可能不實用的動態 IP。 例如:
RewriteCond %{QUERY_STRING} !^action=logout(?:&|$)
RewriteCond %{REMOTE_ADDR} !=203.0.113.111
RewriteRule ^wp-login\.php$ - [F]
203.0.113.111
是您的外部 IP 地址。 請注意,由於我們在CondPattern上使用=
前綴,這是一個精確的字符串匹配(不是正則表達式),因此點不需要反斜杠轉義。
好吧,我不知道這是一個非常好的解決方案,但它對我有用:
ln -s wp-login.php mySecretLogin.php
mySecretLogin
作為推薦人mySecretLogin
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^https://mysite\.tld/mySecretLogin(/|\.php)$
RewriteCond %{QUERY_STRING} !^action=logout(&|$)
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 訪問它的用戶。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.