2017-06-30 84 views
1

獲得HTTP認證用戶名以確保跨不同Web服務器(Apache,IIS,Nginx等)的完全可移植性的最佳方式是什麼?

我的理解是,$_SERVER['REMOTE_USER']是CGI標準,但是可以安全地假設所有的web服務器都支持這個標準嗎?

還有至少其他兩個變種:$_SERVER['PHP_AUTH_USER']在Apache和$_SERVER['AUTH_USER']上IIS。如果$_SERVER['REMOTE_USER']是使用正確的變量,爲什麼這些服務器特定的變體存在?


相關線程,這僅覆蓋IIS/ColdFusion的,不*/PHP:Difference between AUTH_USER and REMOTE_USER cgi variables

回答

1

的REMOTE_USER變量(對應於$ _SERVER [ 'REMOTE_USER'〕中PHP)是CGI 1.1標準,但假設所有Web服務器都支持它,甚至以相同的方式使用它是不安全的。事實上,只有當身份驗證方案是基本或摘要時才適用,而在IIS中,您可以使用集成Windows身份驗證或其他類型的身份驗證(例如,基於證書或基於ASP頁面的Forms身份驗證)。其他Web服務器可能有自己的類似方案。

This section of the PHP Manual狀態:

$ _SERVER是含陣列的信息,如標題,路徑和腳本的位置。該數組中的條目由Web服務器創建。不能保證每個Web服務器都能提供這些內容;服務器可能會省略一些,或者提供這裏沒有列出的其他人。也就是說,大量的這些變量在»CGI/1.1規範中有說明,所以您應該能夠期待這些。

+0

關於IIS,文檔說AUTH_USER是使用的正確變量,但是REMOTE_USER總是相同的。因此,這似乎是最便攜的。 https://msdn.microsoft.com/en-us/library/ms524602(v=vs.90).aspx – HappyDog

+0

我認爲你會好的,但請記住,MSDN文檔是指你應該期望什麼時候運行經典ASP,ASP.NET和ISAPI代碼。您可能會使用FastCGI模塊,並且將用戶憑據傳遞給PHP需要在PHP配置文件中設置「fastcgi.impersonate = 1」(默認設置爲「fastcgi.impersonate = 1」)。同樣,在Apache或nginx中使用FastCGI時,您需要確保將所需的服務器變量轉發/映射到PHP(例如,通過'fastcgi_param REMOTE_USER $ remote_user;')。 – Cahit

+0

這聽起來可以接受,因爲這意味着如果Web服務器配置不正確,那麼默認情況下,您將不會登錄(因爲該變量未暴露給PHP)。因此,這聽起來像是一種失敗安全的方法。在此基礎上,我將繼續使用'REMOTE_USER'並忽略其他類似的便攜性較差的變量。 – HappyDog