2010-08-23 38 views
2

因爲我的主機具有的設置(在CGI接口上運行),變量$ _SERVER ['PHP_AUTH_USER']和$ _SERVER ['PHP_AUTH_USER']和$ _SERVER ['PHP_AUTH_PW']被返回爲空。是否有任何解決方法讓他們工作,因爲我需要使用它們進行身份驗證。我無法移動託管或更改界面。

我通過curl發送auth請求到一個url/api/projects/... 這是由modrewrite解釋,然後根據規則進行處理。

當我嘗試這是我的本地主機上運行甲基苯丙胺,或者我用我的其他主機它工作正常(不使用CGI接口),但我需要它運行在服務器上,變量被丟棄!

有人可以幫我嗎?

回答

2

根據手冊,這些變量僅在PHP作爲Apache模塊運行時可用。 http://php.net/manual/en/features.http-auth.php

你可以試着說你的託管服務提供商,並看看他們是否可以將它們提供給您,當CGI請求分派。

+0

我應該檢查一下。不幸的是,他們可以使它們可用於我。你知道是否有可能使用類似於這裏的工作:http://planetozh.com/blog/2009/04/http-authentication-on-php-as-cgi-like-dreamhost/ – Designer023 2010-08-23 10:45:03

+0

它真的取決於哪些環境變量可供您使用。一個起點可能是'print_r($ _ SERVER)',並檢查CGI提供給您的是什麼。 – 2010-08-23 10:48:56

+0

通過添加: 的RewriteCond%{HTTP:授權}^ 重寫規則^(*)(*) - [E = HTTP_AUTHORIZATION:%1] 我所做的PHP_AUTH_PW和PHP_AUTH_USER提供給我,這似乎確定。現在在那裏的一半!只需要內部服務器請求即可工作! – Designer023 2010-08-23 11:11:45

1

按照docs,這兩個變量不是CGI模式下可用。

PHP中的HTTP身份驗證掛接僅在它作爲Apache模塊運行時纔可用,因此在CGI版本中不可用。

然而,採取鑽研用戶供稿的註記。有很多人聲稱已經取得成功的解決方法,例如, this one。也許值得一試。

+0

那一半已經解決了問題,謝謝。出於某種原因,現在它可以從外部位置訪問它,即:從我的本地主機我可以調用API並獲得響應。但從服務器到另一個目錄中的API,它失敗了!奇怪!我會繼續尋找! – Designer023 2010-08-23 11:04:29

0

如果是自動使用,根本不需要使用HTTP認證。只需發送一個祕密令牌作爲憑證。

http://example.com/service.php?auth=A235BDA74456CC3 
0

Apache Web服務器塊在默認情況下,這是PHP使用什麼來填充PHP_AUTH_USER/PASS CGI應用程序的HTTP_AUTHORIZATION環境變量。通過使用SECURITY_HOLE_PASS_AUTHORIZATION標誌集重新編譯Apache可以關閉此行爲。

的「安全漏洞」是共享服務器上的任何其他用戶將能夠看到用戶與您的網站進行身份驗證的密碼。是否其實您的安全漏洞取決於;通常不會。

如果你是一個便宜的共享服務器,你很可能沒有機會重新編譯Apache。

你知道是否可以使用類似於左右工作到這裏

是的,它應該做的,如果你有mod_rewrite可用。 (關於它的告誡是一個潛在的「安全漏洞」仍然適用。)

它是,但是,醜陋,複雜的部署。此外,給出的示例腳本還存在一些問題(使用explode丟棄密碼中的任何:字符,如果沒有正確使用htmlspecialchars(),則會引入XSS漏洞。)

這種胡說是HTTP認證越來越不受歡迎的原因之一。大多數站點部署基於表單/基於cookie的身份驗證。對於API,您通常會擁有自己的基於令牌的身份驗證,而不是依賴基本身份驗證。

+0

我無法重新編譯,但我確實可以使用mod重寫。我已經使用了目前爲止似乎有效的 RewriteCond%{HTTP:Authorization} ^(。*)在不同的目錄中它是自己的API,我將組成! :D感謝您的答案的細節。現在有很多意義 – Designer023 2010-08-23 11:31:44