在Apache日誌配置中,可以指定應該記錄HTTP驗證用戶名。大多數PHP腳本都有自己的基於cookie的認證。即使身份驗證是基於cookie的,是否可以在PHP中爲Apache提供用於登錄目的的HTTP身份驗證用戶名?如果是,代碼將如何?如果不是,有什麼替代方案?將用戶名放入apache access_log中,並且不使用HTTP驗證
回答
Apache在筆記模塊之間傳遞數據。如果您將PHP作爲Apache模塊運行,則可以使用apache_note()
來獲取和設置筆記。然後可以包含the %{note_name}n
log format string將其寫入訪問日誌。這不會將任何數據「泄露」回客戶端。
在PHP:
apache_note('username', $username);
在您的服務器配置:
LogFormat "%h %l %{username}n %t \"%r\" %>s %b" common_with_php_username
CustomLog logs/access_log common_with_php_username
一種可能性是將用戶名&存儲在其他地方的session_ids之後,並讓日誌在其中存儲cookie值(通常爲%{PHPSESSID}C
),然後可以追溯到該值。
另一種選擇是與用戶名發送頭回客戶端,您session_start
後最好立即:
PHP:
header('X-Php-Sess-User: '.$username);
的CustomLog:
%{X-Php-Sess-User}o
短使用Apache處理程序觸摸內部認證*數據結構,最好的辦法就是使用環境變量。你會在你的PHP代碼
apache_setenv('USERID','jrodriguez',true);
使用apache_setenv設置一個最高級別的環境變量,然後使用「%{USERID} E」,而不是「在你的Apache配置一個LogFormat的條目將值寫入日誌文件%U」
LogFormat "%v:%p %h %l %{USERID}e %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" envuid_combined
CustomLog /path/to/access.log envuid_combined
當然,執行實際 HTTP認證時,真正的證書將被永遠失去了,所以考慮節省%U別的地方 - 無論是在一個新的領域或並行的日誌文件。
環境變量不是全局的,因此不可靠 – 2010-08-02 17:07:55
@Esben不確定你的意思,但總的來說,沒有 - 一個環境變量不是全局的。上述解決方案對我來說非常合適。 – rjmunro 2011-01-18 12:51:38
因爲Apache 2.4.7阿帕奇可以讓你的響應頭複製到一張紙條。因此,如果您不將PHP作爲Apache模塊運行(但例如使用PHP-FPM),並且您也不希望將日誌值發送給客戶端(如果將它設置爲響應頭),這裏有一個辦法做到這一點:
PHP:
header('X-Username: '.$username);
的httpd.conf:
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{username}n\"" logfmtname
vhost.conf:
CustomLog logs/vhost-access_log logfmtname
# copy response-header value to note
Header note X-Username username
# unset response-header so client won't get it
Header unset X-Username
- 1. 用Apache身份驗證的用戶名覆蓋mercurial用戶名
- 2. 在Apache Jersey中進行身份驗證而不使用Http身份驗證?
- 3. 如何使用普通HTTP身份驗證和PHP在Apache下獲取經過身份驗證的用戶名?
- 4. Jquery驗證:用javascript提交表單並且不進行驗證
- 5. 驗證用戶名,因爲用戶使用jQuery和ASP.NET鍵入
- 6. 用戶名驗證
- 7. 身份驗證要求輸入用戶名和密碼http:// www
- 8. 使用HTTP WCF定製用戶名身份驗證
- 9. apache access_log中的垃圾?
- 10. apache access_log中的請求數
- 11. 驗證用戶和不驗證用戶
- 12. Zend框架驗證:驗證空字符串並且不驗證空值
- 13. 驗證使用HTTP共享客戶端
- 14. Apache中的Kerberos用戶身份驗證
- 15. 驗證文件名的用戶輸入
- 16. 如何使用純HTTP認證和PHP在Apache下獲取經過身份驗證的用戶名?
- 17. 驗證HTTP POST並確保數據不被用戶
- 18. 如何使用php驗證用戶名?
- 19. 如何使用Javascript驗證用戶名?
- 20. 如何在PHP中不使用http或https驗證域名?
- 21. 驗證用戶並使用ChangePassword控件
- 22. 記住並驗證用戶使用Cookie
- 23. apache mina sshd驗證客戶端簽名
- 24. Apache Camel使用DTD驗證
- 25. 使用用戶名/密碼在url中的Apache基本身份驗證
- 26. 如何驗證密碼並確保用戶名未被使用?
- 27. 在Apache + mod_wsgi上使用HTTP驗證部署Django應用程序
- 28. 在PHP中訪問HTTP身份驗證用戶名?
- 29. Windows身份驗證提示用戶名字段autopopulates並且無法更改
- 30. 使用JavaScript驗證用戶輸入
我不要認爲這是個好主意。爲什麼不使用單獨的日誌文件? – 2010-08-02 15:26:43
因爲我想用AWStats這樣的工具做簡單的統計。 – chiborg 2010-08-02 15:35:38