2010-07-28 29 views
34

很多PHP程序都要求用戶在應用程序根目錄的配置文件中以純文本(字符串或常量)存儲mysql密碼,這一直困擾着我。比在配置文件中以純文本方式存儲mysql密碼更好的方法嗎?

這些年來有沒有更好的辦法呢?

到目前爲止,我已經提出了兩個最低的安全性提升:(萬一

  1. 使文件通過使用規則的.htaccess 網頁不可讀PHP失敗,或者有一個安全漏洞閱讀PHP源)

  2. 在存儲器破壞密碼分貝後連接的情況下(未設置) (防止串從安全漏洞,注射等)

轉儲

但當然這些解決了原來的問題。

感謝您的任何其他想法!

+0

技術上不是答案,但您可以配置mysql以僅接受可信來源,例如只有unix域套接字,或者只使用正確的SSL證書。 Ontopic:請參閱我的答案以瞭解如何不存儲文字密碼。 – mvds 2010-07-28 15:27:39

+0

你有沒有考慮過一些'備份(tgz | zip)'文件存在的可能性,包含密碼? – mvds 2010-07-28 15:48:14

+1

甚至比本地備份還要糟糕,因爲我會問這些問題,因爲純文本只是遲早的乞求 – 2010-07-28 15:55:54

回答

11

由於您的代碼將需要密碼,因此沒有完美的安全性。但是你可以很難恢復。

我把一些散在我的web配置,爲環境變量,說MYSQL_PASS_HASH

然後,我像做md5(getenv('MYSQL_PASS_HASH').'gibberish$qwefsdf'),然後將其密碼。當然,如果你偏執,你應該在unsetenv之後。

您的密碼不會真正存儲在某個地方,只有當您的數據庫包含Web配置時,才能恢復。

這發生在webroot以外的文件中(請勿將您的所有信任放在.htaccess之內)。

+0

我認爲這是迄今爲止的第一個答覆,這是對純文本的真正改進。接下來的問題會讓其他用戶很容易地配置。 (在webroot之外移動並不總是可能的,因爲如果它可以包含,file_get_contents也可以在它上面工作)並不是真正的解決方案 – 2010-07-28 15:33:58

+10

-1:通過隱藏安全 – symcbean 2010-07-28 15:35:32

+1

@symcbean:爲什麼?我在這裏發佈它,就像我在自己的服務器上配置它一樣!這不是晦澀難懂的,但發表在所有地方的SO!我只是將風險分散在兩個文件中,這兩個文件都不應該是可訪問的,並且不應該**這兩個**都是同一備份的一部分,**加上**不以明文形式存儲它。 – mvds 2010-07-28 15:46:15

12

將配置文件保存在文檔根目錄之外是改進配置文件安全性的常用方法。

+3

我只是在輸入文本。我要指出的是,如果不是大多數共享主機不允許他們的客戶訪問文檔根目錄之外的任何內容,很多情況下都會指出這一點。 – 2010-07-28 15:10:33

+0

仍然有文字密碼存儲在某個文件的某處。這比你需要承擔的風險還要高。 – mvds 2010-07-28 15:49:15

+0

Peter O'Callaghan,我有專用的服務器,甚至我不能在文件根目錄 – 2016-01-25 19:20:44

0

它不必位於webroot中。您可以將文件移動到webroot之外並以此方式進行調用。這只是意味着文件不能直接從網絡中調用。

如果您的代碼存在安全漏洞,比如包含沒有從GET數據中過濾的東西,那麼該文件仍然存在風險。真正的關鍵是確保你的應用程序也是安全的。

25

個人而言,我在我的Web文件夾根目錄外的config.ini文件中存儲敏感信息,例如數據庫連接詳細信息。然後在我的index.php 可以做:

$config = parse_ini_file('../config.ini'); 

這意味着變量是不可見的,如果你的服務器意外開始輸出PHP腳本爲純文本(這以前也發生過,臭名昭著至Facebook);只有PHP腳本才能訪問這些變量。

這也是對的.htaccess在那裏,如果你的.htaccess文件被移動或破壞沒有意外不依賴。

警告,2017年2月14日添加:我現在將配置參數存儲爲環境變量。我現在還沒有使用.ini文件的方法。

0

如果您願意爲文件安全權衡可用性,可以將密碼從配置文件中取出,並要求管理員在引導時將其鍵入並將其存儲在全局變量中。

您仍然必須確保自己可以安全地避免可能轉儲該變量的注入式攻擊,當然您在(重新)引導過程中還有一個手動步驟。

+0

之外存儲。不幸的是,這在一個典型的PHP/MySQL應用程序中是不可能的。 – 2010-07-28 15:45:35

+0

同意,但我認爲這是一個值得列出的解決方案。 – Greg 2010-07-28 18:25:46

2

當然,您不應該在文檔根目錄中的純文本文件中存儲密碼。你採取什麼進一步的步驟來保護它將取決於你必須配置你的網絡服務器的訪問級別。

您可以在php.ini中定義密碼(或通過Apache配置或.htaccess中的ini設置)。或者在啓動Web服務器時將其設置在環境中。

加密密碼沒有意義 - 這意味着您需要存儲解密密鑰 - 除非您使用用戶提供的密碼與仲裁身份驗證來解密密碼(但這可以防止未經身份驗證的會話訪問數據庫,當你需要將新用戶添加到仲裁時會變得麻煩)。

如果它是一個便宜的託管軟件包,並且在文檔根目錄之外沒有可訪問的存儲空間,那麼將密碼存儲在一個php包含文件中應該防止它被暴露(文件將被下載的php intead解析)。或者,在開始時用「.ht」命名文件可能會阻止遠程訪問。

注意你的第二個選項有點多餘 - 如果有人可以對你的代碼做很多的損害,那麼他們不需要從正在運行的代碼中提取密碼。

真的沒有解決方案的問題。

C.

+0

和你一樣,我認爲這是一個雞/雞蛋的問題,但我想看看這裏的一些偉大的思想能夠提出什麼。 – 2010-07-28 15:48:01

+0

在某種形式的加密中顯然存在一點,保留兩個(或更多)部分以儘可能恢復分離的密碼。 (例如'/ etc'下的一部分,另一部分包含在你的包含路徑中,但不包含在你的webroot中) – mvds 2010-07-28 15:52:18

2

除了正常存儲這些敏感數據,你也應該create a separate MySQL user只具有所需的privileges and restrict the access到它需要訪問數據庫/表/視圖。由於數據庫服務器通常與Web服務器在同一臺計算機上運行,​​因此也要限制對本地訪問的訪問。因此,如果只需要從單個數據庫/表中讀取數據,請不要使用具有超級用戶權限的用戶。

+2

很好的提示限制權限 - 因爲許多PHP應用程序採取懶惰的方式,並且讓用戶只配置一個MySQL登錄,它可以創建表格等等。但是,當然,即使是較小的權限仍然需要在大多數應用程序中編寫,並且可以用這種方式完成很大的損害。 – 2010-07-28 15:43:52

相關問題