簡體   English   中英

htaccess 只允許特定的 php 查詢

[英]htaccess only allow specific php query

我有一個 WordPress 網站,我通過 O2Auth 提供商向用戶授予訪問權限,因此他們永遠不必查詢wp-login.php 但是,當用戶注銷時,他們需要查詢wp-login.php?action=logout&_wpnounce=dead0beef

我想通過 .htaccess 保護wp-loginRequire 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上使用=前綴,這是一個精確的字符串匹配(不是正則表達式),因此點不需要反斜杠轉義。

好吧,我不知道這是一個非常好的解決方案,但它對我有用:

  • 首先,我在 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(&|$)
 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM