2012-01-05 59 views
2

我正在努力實現一個環境,即多個網站將使用與PHP自己的MySQL數據庫實例完全相同的PHP副本。這顯然意味着每個網站的連接憑證,越多的用戶密碼越多,因此更適合黑客的目標。只是爲了確保每個人都在同一頁這些都是我在談論的憑據...PHP:確保數據庫連接憑據的安全

$user = 'user';// not actual user, not root either 
$pass = 'pass';// not actual password 
$server = 'localhost'; 
$database = mysql_connect($server,$user,$pass,true|false); 

所以,我說的是用來密碼連接到數據庫中,而不是在密碼數據庫(爲了澄清我用鹽和胡椒粉進行了散列)。

我還沒有讀過任何我認爲可以遠程表明您可以擁有100%安全的安全性的東西,因爲顯然服務器需要連接到數據庫併爲訪問者全天候地獲取內容;如果我錯了,我很想聽聽這是如何做到的。因此,讓我們假設黑客擁有root用戶訪問權限(或者如果這並不意味着訪問PHP代碼,那麼我們就說可以訪問所有的PHP源代碼),並且他們(在這種情況下)希望訪問/修改/等數據庫。如果我們無法阻止他們訪問PHP源代碼,那麼我們希望儘可能減慢它們的速度。我可以將每個站點/數據庫連接密碼保存在每個站點的單獨文件中(可以像我在完成多域支持後的幾周內),而不是在public_html(顯然)內部。我使用序列化和反序列化來存儲某些變量,以確保當共享主機上的數據庫變得不可用時防止某種程度的容錯性(防止站點A查看並像站點B一樣操作,反之亦然),因爲數據庫有時可能無法使用多次一天(我的數據庫錯誤日誌被寫入SQL服務再次可用並捕獲這些「離開」錯誤)。我想到的一個想法是確定一種將密碼存儲在一個散列中的方法,並將它們散列爲用於通過PHP連接到數據庫,儘管我希望對此有一些意見。

如果有人從數據庫的角度有一個建議(例如有限制用戶選擇,插入,刪除,更新等,並且不允許DROP和TRUNCATE作爲例子)我主要關心的是確保我是SQL中立的因爲我打算最終從MySQL遷移到PostgreSQL(這可能或可能不相關,但如果最好提及它)。我目前使用phpMyAdmin和cPanel,phpMyAdmin顯示連接的用戶與站點的數據庫用戶名不同,所以在這方面,我仍然可以使用該用戶的某些命令(DROP和TRUNCATE作爲示例再次)並限制SITE用戶的權限,除非我出於某種原因被誤認爲?

有沒有辦法配置連接憑證被接受的地方的上下文?爲了澄清,訪問源代碼的黑客不會像合法用戶那樣訪問站點。

另一個想法是基於系統的加密,是否存在一個近乎普遍的(如在每個或幾乎每個LAMP Web主機設置中)網絡託管技術,其中系統可以通過Apache讀取/寫入文件會引入一個黑客必須確定一種避開方法的新層?

我對每個用戶當然使用不同的密碼。

我目前在共享主機,但希望我的設置將最終擴展到專用主機。

那麼對我的安全概念有什麼想法以及我可以嘗試使我的數據庫連接憑證更安全嗎?

說明:我正在尋找我可以追求的想法。如果對任何建議有不同意見,請澄清並解釋您的擔憂,以替代對特定方法進行辯論,因爲我可能甚至可能沒有考慮過讓別人開始追求某個給定的概念。謝謝!

+0

這不是一個建設性的問題,不適合SO,請發表具體問題,這隻會導致辯論和討論。 – Jakub 2012-01-05 15:07:59

+0

我看不出如何提高存儲數據庫憑證的安全性不具有建設性。我不想爲辯論尋找辯論,我會在我的問題上加上澄清。 – John 2012-01-05 15:16:38

回答

5

有一點可以從嘗試到已到你的系統的root訪問權限的入侵者慢下來獲得的。即使您設法將憑證隱藏得足夠讓他們灰心,他們已經可以訪問您的系統,並且可能會以百萬種方式造成嚴重破壞,包括修改代碼以執行任何他們想做的事情。

最好的辦法是把重點放在防止壞人從不斷滲透到你的外部防禦,擔心你確信你做的一切,你可以讓他們在家門口後才休息。

話雖如此,限制數據庫用戶帳戶僅特權的特定子集絕對不是一件壞事做,如果你的架構允許它。

+0

我肯定會相應地調整權限,希望先聽聽別人的一個好主意。請記住,我是一名Web開發人員,我實際上並未維護服務器。 – John 2012-01-05 15:20:31

3

正如code_burgar所說,一旦你的盒子產生根源,就爲時已晚。話雖如此,但我不得不在我參與的一個項目中實施額外的安全策略。將配置文件存儲在加密分區中的解決方案,以便直接訪問機器的人員無法通過將驅動器連接到另一臺PC來取消密碼。當然,這是除了文件系統權限以外,所以人們無法從操作系統本身讀取文件。

另一個細節值得拉扯大,如果你是安全真正偏執:

$user = 'user';// not actual user, not root either 
$pass = 'pass';// not actual password 
$server = 'localhost'; 
$database = mysql_connect($server,$user,$pass,true|false); 

unset($user, $pass, $server); // Flush from memory. 

您可以使用後unset的關鍵變量,以確保它們不能var_dumped或從存儲器中檢索。

祝你好運,希望有所幫助。

3

您想要在層中處理安全性。是的,如果攻擊者擁有root訪問權限,那麼你處在一個非常糟糕的地方 - 但這並不意味着你不應該保護自己免受滲透的影響。大多數的這些建議可能很難在共享主機做...

假設你正在使用一個體面的託管服務提供商,以及LAMP的最新版本,以獲得root訪問所需的工作量是巨大的 - 除非你是一個非常有利可圖的目標,這不是你最大的擔心。

我假設你適當強化您的服務器和基礎設施,並檢查他們正確配置。您還需要關閉不需要的服務 - 例如如果您的FTP服務器正在運行,攻擊者可以暴力破解密碼並不需要root進入。

您應該做的第一件事是確保應用程序代碼沒有漏洞,並且您有一個強大的密碼政策。大多數「黑客」並不是邪惡天才們在你的服務器上花費數月的時間,直到他們擁有「根」 - 這是由於愚蠢的錯誤(例如SQL注入)或弱密碼(任何人的「管理員/管理員」)造成的結果。 。

接下來,你要確保,如果你的網絡服務器被攻破 - 但不是在「根」級 - 您可以防止攻擊者執行任意SQL腳本。這意味着限制您的Web服務器的權限,以便儘可能「讀取和執行」,以便他們無法上傳新的PHP文件。這也意味着刪除諸如CPanel和phpMyAdmin之類的東西 - 可以危害生產服務器的攻擊者可能會危及這些應用程序,並從您那裏竊取密碼(如果需要,可以在不同的服務器上運行它們)。

這絕對值得您設置數據庫權限的方式 - 雖然這可能很難,並且可能不會產生更多的額外安全性。至少,爲每個客戶端創建一個「Web用戶」,並在該用戶的數據庫上授予該用戶「插入,更新和刪除」的權限。

0

我發現在根對PHP(Linux)的解決方案創建一個目錄說db並創建一個類,定義在類的所有數據庫連接變量和訪問方法說DBConnection.php現在您的網站是example.com你存儲public_html目錄文件創建這個目錄下的PHP文件連接和做所有的數據庫操作,並使用下面的語句

require('../db/DBConnection.php'); 

這個文件不能使用訪問「www.example.com/db包括DBConnection.php文件/DBConnection.php'

你可以在你的網站上試試這個。