簡體   English   中英

PHP和.htaccess身份驗證解決方案

[英]PHP and .htaccess authentication solution

這是布局:

web root
  - admin (dir)
      - index.php
      - js
      - img
      - other files / dirs
  - dir
  - files

到目前為止,我使用.htaccess passwd保護了管理員目錄,因為我希望對該目錄中的所有文件進行完全訪問控制(包括js腳本,jpg,pdf等)。 另一方面,我的自定義CMS使用PHP sesssion / cookie為其他URL提供身份驗證。 我想要完成的是對.htaccess受保護的目錄使用相同的PHP身份驗證,避免為已經過PHP身份驗證的用戶提供用戶/密碼的彈出提示。 綜上所述:

  • 我希望admin dir使用.htaccess規則進行身份驗證
  • 如果用戶已使用PHP進行身份驗證(在HTML表單中登錄,在未受保護的文件上),則在訪問admin dir內容時繞過第二個.htaccess身份驗證過程
  • 如果非PHP身份驗證的用戶嘗試訪問admin目錄中的內容,則應觸發HTTP身份驗證彈出窗口

我讀過的大部分內容建議將管理目錄移到Web根目錄之外,並使用readfile從PHP腳本訪問文件,我不想這樣做。 這個目錄上有動態內容,還有靜態內容。 我知道apache會在加載任何資源之前觸發auth彈出窗口,所以問題是如何讓apache知道用戶已經過身份驗證。 還有其他建議/解決方法嗎?

您可以使用.htaccess文件中的SetEnvIf變量來檢查是否設置了某個Cookie值。 例如(這不是很安全,但僅用於說明):

AuthType Basic
AuthName "Protected Login"
AuthUserFile "/path/to/.htpasswd"
AuthGroupFile "/dev/null"
SetEnvIf Cookie PHPSESSID=.* PASS=1
Order deny,allow
Deny from all
Allow from env=PASS
Require valid-user
Satisfy any

SetEnvIf Cookie PHPSESSID=.* PASS=1檢查Cookie是否設置了PHP會話ID,如果是,則足以Satisfy身份驗證過程並且Allow from env=PASS使其跳過登錄提示,如果這是真正。

同樣,這個例子不是很安全,因為在沒有成功的身份驗證嘗試的情況下調用session_start()時已經設置了PHP會話cookie,因此最好設置一個難以猜測的更加密碼/隨機的cookie值。 例如:

SetEnvIf Cookie AJNC3Z921dmc4O8P2 PASS=1

這樣,如果您通過PHP成功驗證后設置了AJNC3Z921dmc4O8P2的cookie值,這將足以通過身份驗證過程。 確保設置正確的cookie過期時間,以避免人們長時間通過登錄提示。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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