2011-05-04 45 views
19

我們有一個開發服務器和一個帶有不同數據庫連接細節(用戶名,密碼等)的活動服務器。在哪裏存儲PHP應用程序的數據庫登錄憑證

目前,我們正在將數據庫連接詳細信息存儲在initial.php中,並且如果存在DEFINE語句,則會選擇其中一個。我們在我們的實時服務器上手動添加DEFINE語句。

這是一種安全的方法嗎?管理數據庫連接安全性的更好/替代方法是什麼?這

一個後果是,每一個開發人員可以看到數據庫連接的細節,這是一個有點冒險...

+1

您使用的是什麼操作系統,網絡服務器和數據庫?這可能是相關的。例如,使用MS SQL Server和在Windows機器上運行的Web服務器,您可以使用集成安全性,以便Web服務器進程本身將對數據庫進行身份驗證,並且PHP代碼不需要用戶名和密碼。 – 2011-05-04 12:02:51

回答

12

我使用.ini文件,然後通過parse_ini_file(INI_FILENAME_HERE, true)解析。 該文件不受版本控制(與php-/template-/whatever-files一樣)。因此,在每臺機器上,我爲相應的數據庫連接創建該文件(.database.ini)。

例的.ini文件的一個MySQL連接,使用PDO:

[db_general] 
driver = "mysql" 
user = "USERNAME" 
password = "PASSWORD" 

; DSN 
; see http://www.php.net/manual/en/pdo.drivers.php 
[db_data_source_name] 
host = "localhost" 
port = 3306 
dbname = "DATABASE_NAME" 

; specify PDO-options, provide keys without PDO:: 
; see http://www.php.net/manual/en/pdo.drivers.php 
[db_pdo_options] 
MYSQL_ATTR_INIT_COMMAND = "SET NAMES utf8" 

; specify more PDO-attributes, provide keys without PDO:: 
; see http://php.net/manual/en/pdo.setattribute.php 
[db_pdo_attributes] 
ATTR_CASE = "PDO::CASE_LOWER" 
ATTR_ERRMODE = "PDO::ERRMODE_EXCEPTION" 
ATTR_EMULATE_PREPARES = false 

既然不能使用的.ini文件密鑰中::,使用constant('PDO::' . $iniKey)在你的代碼以獲得所需的PDO -constants。

+0

這不能解決可見性問題 - 但你可以在php.ini文件中設置一個(單個)默認mysql數據庫/用戶 – symcbean 2011-05-04 12:30:01

+0

@symcbean也許我沒有真正理解這個問題,但我認爲它是一個普通的有關存儲數據庫設置的問題。 「此文件不受版本控制」回答爲「此...的一個後果」。所以每個開發人員都需要他/她自己的設置文件,以及實時系統上的設置文件。 – feeela 2011-05-04 12:38:15

0

有點難以保護您的應用程序免受使用它的開發人員的影響。我的建議是從配置文件加載所有密碼,並創建2個獨立的環境:一個用於開發,一個用於生產服務器。爲開發人員提供完全訪問開發人員的機會,並且在轉移到生產服務器時,應用程序將自己提供生產配置,該配置將僅存儲在該機器上,因此大多數開發人員無法訪問。這種類型的安全性更多的是一個過程,你必須定義幾個步驟,比如誰有權訪問生產機器以及誰正在發佈......等。

0

這是一種安全的方法嗎?

這取決於您的安全定義。

每個開發人員都可以看到數據庫連接的詳細

據我所知,不是在php.ini文件使用默認的用戶名/密碼/數據庫等,這個問題幾乎是不可避免的(使用默認值意味着他們已經自動訪問數據庫)。

我想你可以使用不同的包含文件使用Zend編碼器加密一個函數返回數據庫句柄 - 並設置不同文件的範圍和權限,但它很難將PHP代碼隔離到底層數據。另一種方法是將所有內容限制爲web服務,並在Web服務層中實現擴展權限模型。

2

我最近不得不處理這個問題,而我所做的是創建兩個新的數據庫用戶。第一個沒有特權,除了在他自己的模式中對錶格的讀特權。第二個插入特權到一個「加載」表我將填充我的代碼。

非特權用戶在他的模式中獲得了「憑證」表,該表包含插入用戶的憑據和密碼(以及我的應用程序需要的其他一些參數)。所以代碼只包含非特權用戶的憑證,硬編碼和定期更改,並且在運行時會查找需要插入的憑證。查找發生在我們的防火牆後面,服務器之間,所以它不是一個外人可以竊聽的東西。

這不是我擔心的開發者,它是外部人員和高級用戶,他們理論上可以訪問Web服務器並查看ini文件。這樣,只有開發人員和數據庫管理員才能窺探(我們都知道彼此)。任何人都必須弄清楚如何查詢數據庫,找出要使用的SQL,弄清楚如何運行代碼......這不是不可能的,但肯定是一個巨大的多步驟痛苦,不值得。

非常安全的 - 在理論上,反正...

1

另一種方法是設置環境變量的直播和開發機器上,並從代碼中訪問他們...我不知道很多PHP,但是在Python這將是:

import os 
password = os.environ('DB_PASS') 

這可讓您根據需要開發和部署的服務器分配帳戶和密碼。根據他們在該機器上的權限,可以防止開發人員訪問活動密碼。

相關問題