2009-06-13 119 views
5

第一次讀者,第一次海報(宇!)將PHP登錄信息存儲在PHP代碼中存在安全風險?

所以我一直在實施我的登錄腳本的非正式網站。不太可能會受到影響,但爲了安全起見,我想問問在PHP代碼中以明文形式存儲MySQL數據庫登錄時是否存在安全風險。

據我所知,代碼本身是由Apache解析的,所以最終用戶沒有看到它(只是輸出),這意味着它應該是安全的保持...但我會像第二種意見。

摘要: 通過mysql_connect,mysql_select_db,mysql_query訪問數據庫。登錄信息存儲在腳本每次迭代時定義的局部變量中,並且(我認爲)一旦腳本終止,就會拋棄。

安全漏洞?

回答

10

您也可以考慮將用戶名/密碼組合移至位於webroot之外的單獨配置文件。確保該地點不能從網絡服務器端直接訪問。

這樣,如果由於某種原因網絡服務器決定不再執行PHP文件,則不會將帳戶信息丟失到數據庫服務器。作爲一個額外的好處,如果您使用任何在webroot中創建.php文件(編輯器,SVN或其他)的副本,您不會冒任何繞過.php執行的風險。

+6

真相。當我第一次開始使用linux時,沒有注意到Gedit製作了filename.ext〜當我上傳文件夾時,〜文件將與它一起。然後,我可以去mysite.com/index.php~那裏它是純文本 – sqram 2009-06-13 20:57:14

+2

@lyrae:我...好主,謝謝你指出。我不知道... O.o *運行並刪除* – 2009-06-14 00:28:30

+0

如果你絕對必須在PHP文件中有密碼,那麼至少應該是sha1或md5。 – Shoan 2009-06-14 04:03:36

0

任何人都可以在該Web服務器上以root權限登錄(或者也可能稍低一些)將能夠看到您的密碼 - 但是,對於超級用戶(無論您身在何處)保持你的密碼,他們可以破解並找到它)。除了這個風險,你應該是安全的。

編輯:如果您的密碼在.php腳本中清晰可見,那麼也可以使用服務器的備份(如果未加密或由可以解密他們的人)恢復密碼。通過將密碼保存在不同的安全位置,並且只在嚴格限制的情況下(安全地)發送密碼,這種可能的攻擊可能會被緩解(對於很大的不便/成本)。這是你害怕的那種攻擊嗎?

7

這是針對與數據庫交談的Web應用程序的非常標準的過程。

我建議除了Web服務器和你自己以外的其他用戶使用文件讀取權限 - 如果你的盒子上有其他用戶可以監視文件,他們將能夠訪問你的mysql服務器。

此外,您應該調整頂級目錄的可執行權限,因爲它可以防止未經授權的用戶輸入它。

強化你的mysql用戶允許的主機,這樣只有你需要的盒子可以連接到它。

當然,如果你的盒子受到攻擊並且攻擊者獲得root訪問權限,那麼很少有人會保護你。

+2

+1 - 確保MySql用戶沒有drop/grant等權限也是個好主意。 – karim79 2009-06-13 20:33:28

1

你可以添加一些額外的安全層,把所有的php文件(當然除了index.php)放在一個單獨的目錄下,用.htaccess文件保護它們。這涵蓋了php分析器未被調用並且apache以明文形式返回文件的情況。還有一件事可能是有用的:<?php defined('some_id_here') or die(); ?>。你可以把它放在除index之外的每個php文件的頂部。PHP(你定義some_id_here),所以沒有直接訪問你的數據庫文件。

1

沒有webroot中的大部分代碼,儘管不太可能,但它只是可以採取的第一道防線。

即使數據庫用戶和密碼已發佈,您的數據庫也應該是安全的 - 只需允許少量源計算機連接到數據庫即可。

以深度防禦

<?php // simplest /index.php, as the only .PHP file in the public-accessible webroot 
require '../bootstrap.php'; 
1

我不知道如何連接到你的MySQL數據庫,但是如果你使用PDO存在該PDO構造函數拋出異常的可能性。 如果你不知道這個例外,Zend引擎會默認顯示回溯,並顯示你的連接細節!

將連接信譽存儲在php文件/變量中,或者在這種情況下,您可以使用DSN(數據源名稱)中的PDO,這是正常的。我甚至會建議你把它放在一個php文件中,因爲它會被解析並且不會傳送到網絡上...

更安全的一步就是將登錄詳細信息放在www-root之外或保護它與一個.htaccess文件(這將使它不可能通過網絡服務器訪問該文件)。

但是在我的服務器上,不可能從本地主機連接而不是。所以我不在乎是否有人讀取我的登錄信息(當然不是這種情況)。