2011-07-02 57 views
8

我不喜歡在document_root下存儲站點範圍的加密密鑰和數據庫訪問信息,所以我在conf.d下使用Apache的SetEnv和php.ini文件將這些與代碼庫分開。最大的問題是,哪一個更好?內部環境變量在apache vhost文件(SetEnv SITEKEY 'oinkoink!')或conf.d/xxx.ini文件(db_pass="oink?")內?也許別的東西?使用SetEnv或php.ini存儲數據庫變量的安全性如何?

的觀光ñ缺點:

SETENV:

+存儲外DOCUMENT_ROOT
+僅給定的虛擬主機訪問
- 可見光與phpinfo()函數 - 黑客需要直接訪問/上傳漏洞的文件

get_cfg_var:

+存儲DOCUMENT_ROOT
外不與phpinfo()函數可見
- (非常差)所有定義的INI變量包括在內,所以每一個虛擬主機可以通過(ini_get_all)查詢他們,所以在一個共享的虛擬主機環境中無法使用

回答

4

只要* .ini和SetEnv不在Web根目錄(文檔根目錄)之外,這兩種方法都無關緊要。只要選擇你喜歡的任何一個。我喜歡SetEnv,但它確實只是個人偏好。因爲變量被放入_SERVER,所以使用SetEnv更有意義。使用.ini,我認爲將它留給特定於代碼工作原理的初始化設置會更有意義。

在文檔根目錄下不存儲是防止訪問可能安全的數據的好主意。

請注意,phpinfo()將列出所有已設置的服務器變量,因此請非常小心。

最後,如果你是其中的文件時,請確保您不允許無償../../設置由用戶以某種方式或他們將有機會獲得潛在的安全文件(甚至包括/etc/passwd!)

我覺得你的主問題是「多麼安全」。那麼,這可能是一樣安全,你可以得到沒有造成重大麻煩。 php代碼可以訪問這些變量,所以如果將它們打印出來,它們很容易看到,所以它取決於代碼庫的安全程度。它可能會使用LDAP與MySQL,但這聽起來像一個巨大的痛苦。

1

這是常見的做法在document_root之外使用商店非公開文件。一個典型的佈局可能是這樣的:

.../myProject 
.../myProject/documentRoot 
.../myProject/documentRoot/.... 
.../myProject/nonPublicFiles 
.../myProject/nonPublicFiles/... 

存放在的DocumentRootnonPublicFiles所有非公共的東西你的PHP的東西。 documentRoot將成爲vHost的Apache document_root。由於nonPublicFiles在外,Apache不會回答請求。

Recarding安全,SETENV*的.ini往往是等價的:如果一個人獲得的權利執行任意PHP碼,左右逢源提供敏感信息到該代碼。

我寧願在SETENV*的.ini方法,因爲Apache將不會透露這些細節本身。腳本是必需的。

即使沒有腳本,配置錯誤也可能會泄露nonPublicFiles的內容。

如果您打算使用nonPublicFiles,請提前準備一個腳本,該腳本會檢查一切是否設置正常並轉發電子郵件,如果發現問題。大概使用CRON來調用它。

+1

「如果有人獲得執行任意PHP代碼的權利......」 - 如果發生這種情況,所有投注都將關閉,並且無論您存儲數據庫信譽的位置如何,您都會被徹底地使用。 – Asaph

1

我更喜歡將它們存儲在非公共文件夾中,這些文件夾只能由apache訪問,或者在document_root之外。