2012-06-01 166 views
2

我正在開發一個PHP項目,我正在使用一個全局設置文件,其中包括我需要一些全局值(例如用於連接到mysql的數據庫證書)的位置。 例如:在PHP中存儲敏感數據

的settings.php:

<?php   
    const DB_ADDRESS = 'localhost'; 
    const DB_USERNAME = 'johndoe'; 
    const DB_PASSWORD = 'mypassword'; 
    const DB_PORT = 7777; 
?> 

我的問題,是不是足夠安全? 例如,是否有任何方法可以在explorer/chrome中調試時查看變量值? 有沒有其他更安全的方法?

謝謝。

+0

相關:http://www.stackoverflow.com/questions/7099737/storing-sensitive-values-in-a-secure-location – nickb

+0

[安全存儲數據庫憑證](http:// stackoverflow。 com/questions/10825367/secure-storage-of-database-credentials) –

+0

謝謝。做了一個簡短的搜索,但找不到它。 –

回答

6

PHP信息在發送到瀏覽器之前在服務器上處理,因此在正常情況下無法在瀏覽器內部看到。但是,如果您的網絡服務器配置錯誤,則可能會將代碼的純文本版本發送到瀏覽器,從而使其對用戶可見。這就是爲什麼重要代碼應該始終保存在文檔根目錄之外並在需要時包含在文件中。

3

變量保存在服務器中,不會發送給客戶端。除非您的腳本有任何允許用戶輸出自定義變量的漏洞,否則他們對任何沒有源代碼訪問權的人都將保持安全。

2

這是標準的方式(查看phpmyadmin,mediawiki等):此php文件不可訪問,如果您在服務器設置中未發生任何錯誤,則不可讀。

通常你會添加一個測試,以檢查此設置文件包含在你的PHP文件中的一個:

<?php 
if (!defined('IN_KP')) die("Hacking attempt"); 
?> 

當然,你在你的包含文件定義「IN_KP」:

<?php 
define('IN_KP', true); 
include("sensitive_file.php"); 
?> 

但最好的保護總體上是那些敏感數據不是那麼敏感,因爲你的mysql帳戶只能通過本地主機訪問(如果沒有修復它!)。

+0

謝謝。 MySQL配置爲localhost,但我有其他敏感數據,如私鑰和Facebook祕密ID。 –

1

例如,有什麼辦法可以在explorer/chrome中調試時查看變量值嗎?

如果您從不將它們發送到視圖(即echo,var_dump,print_r,session等) - 則不會。瀏覽器永遠不會知道它們。

2

您的後端代碼應該永遠不會出現在前端,除非您的設置出現嚴重錯誤。如果發生這種情況,並且您的後端源代碼被「泄漏」 - 不太可能,但是possible - 那麼您的密碼將清晰可見。

您可以使用對稱加密方案加密密碼字符串,但必須在某處存儲加密密鑰。然後,如果加密密鑰泄露,您將回到起點。它仍然比純文本密碼好一點,但沒有任何東西會100%安全。

4

雖然這在服務器遭到破壞時幾乎沒有任何保護,但是如果您的源代碼已成爲公衆可見的,通過缺陷或其他漏洞(如:http://www.php.net/archive/2012.php#id2012-05-06-1),越來越常見的方法是設置各種憑據和參數作爲服務器環境變量。

E.g.在apache的虛擬主機/的.htaccess您可以設置環境變量,如以下幾點:

SetEnv DB_ADDRESS localhost 
... 

而且在PHP代碼:

$DB_ADDRESS = getenv('DB_ADDRESS'); 

當然,你可以將此值賦給一個類常量,全球根據您的使用情況等不同而不變......

這也使得您的源代碼更加便攜,允許根據託管環境(分段/生產等)提供不同的配置:

SetEnv APPLICATION_ENV development - .htaccess interacting with Zend Framework?

您的設置永遠不會被硬編碼,也無法在源代碼中訪問。 Heroku使用類似的方法來進行應用程序配置。

+0

謝謝,當我的代碼變成「在線」時,聽起來像是一個很好的解決方案。 –