2012-01-31 72 views
7

我知道規則:永遠不要硬編碼您的密碼,我已經看到這個問題here,它解釋了什麼與Java和MySQL,但我不知道該怎麼做的PHP和MySQL。如何保護PHP中的mySQL連接字符串?

當前連接字符串了這樣

<?PHP 

$DBName = "dbName"; 
$Host = "localhost"; 
$User = "dbUser"; 
$Password = "Yikes_hardcoded_PW"; 

$Link = mysql_connect($Host , $User , $Password , $DBName); 

if (!$Link) { 
    die('Could not connect: ' . mysql_error()); 
} 

?> 
  • ,但我需要有密碼保護,也就是在這個文件中沒有硬編碼。我該怎麼做?

編輯:對於所有我得到這個的downvotes,我還沒有收到這大約是一個真正的安全關注問題的答覆 - 硬編碼密碼。如果沒有發佈滿足該問題的評論或回答,就對真正的問題進行投票是沒有幫助的。

+2

好吧,不要在代碼中輸入密碼。如果它是開源的,那麼任何人都不需要密碼 – 2012-01-31 10:57:14

+2

把它放在一個單獨的配置文件中,並在GIT中忽略它 – Bogdan 2012-01-31 10:58:42

+0

你可以把密碼放在一個像Bogdan建議的單獨文件中,並將它用於開發目的。對於開發來說,實際上可能更容易將密碼保存在dsn中。你走哪條路取決於你的舒適程度。 對於生產,將密碼保存在您的代碼將執行的生產框中。通過廚師,木偶,面料等限制對箱子的訪問和管理設置/重置的密碼。 – dminer 2014-04-01 21:26:47

回答

-2

沒有理由隱藏你的MySQL密碼。只需限制從遠程主機訪問數據庫。或者,您可以爲這個特定的項目/主機/數據庫/操作設置一個沒有密碼的默認MySQL用戶。

要直接回答您的問題,無法混淆密碼。

+0

在隱藏的智慧面前,不隱藏密碼似乎會飛。我並沒有要求密碼被破壞,只是有保障。 – T9b 2012-01-31 11:09:48

+0

@ T9b,然後使用默認用戶,無需密碼。但是,再次說明,如果遠程訪問受限制,則沒有理由隱藏MySQL密碼。請參閱http://www.opensourcecms.com/某些託管CMS允許更改數據庫設置,用戶也能夠看到密碼,並且他們完全知道這一點。 – Gajus 2012-01-31 11:28:50

1

將您的配置存儲到另一個文件中。

$DBName = "dbName"; 
$Host = "localhost"; 
$User = "dbUser"; 
$Password = "Yikes_hardcoded_PW"; 

設置git忽略此配置文件。

+1

配置在另一個文件中,是的,git可以忽略文件,但這並不能回答我的問題。 – T9b 2012-01-31 11:05:19

-1

將憑據編碼到配置文件中並不存在問題。

對於源代碼版本化項目,您應該考慮使用佔位符創建配置模板,以獲取您提交到存儲庫的任何憑據。

在任何部署中,您都應該編輯這些佔位符,使其成爲活動憑據簽出。如果你打算開源,這也將有助於任何使用你的項目的人。

更新(實際上回答這個問題)

數據庫配置確實需要在純文本,硬編碼到PHP文件,然而,你可以將某些事情,以確保它是更安全:

  1. 檢查你的Apache配置的open_basedir限制了其網站根目錄外的訪問文件,其他的虛擬主機實例
  2. 檢查文件系統權限,以確保只有Apache和您的用戶可以訪問該文件
  3. 確保您的MySQL用戶只能設置爲從本地主機的上下文,即grant all privileges on mydatabase.* to [email protected]
  4. 使用防火牆來阻止有效的外部連接到mysql
+0

這個問題不是關於版本控制方面的問題,而是關於以某種方式確保用於PHP的密碼。你能給我一個回答這個問題的例子嗎? – T9b 2012-01-31 11:06:44

+0

確保你的文件系統權限是正確的,這就是真正重要的。只要你和Apache可以訪問它,你應該沒問題。還要確保你在apache中打開的basedir配置是正確的。另外,如果你的mysql創建的用戶語句只指定user @ localhost,它將會更安全 – 2012-01-31 11:13:37

1

你必須硬編碼密碼或某處其他。即使您想使用DSN,也必須在DSN字符串中對密碼進行硬編碼。正如我所看到的,它沒有擺脫硬編碼密碼。

所以問題歸結你能做些什麼來保護包含密碼的文件/串。爲包含密碼的文件設置適當的文件系統權限並設置適當的open_basedir值是您可以執行的操作。如在What's best way to secure a database connection string?中的其中一篇帖子中提到的,您可能還會考慮使用加密分區。

你在你的問題發佈的鏈接,據我的理解去,談到桌面應用程序。而PHP中的桌面應用程序太少,無法認真考慮保護用於php桌面應用程序的數據庫密碼。

1

我也在做這方面的研究。文件權限是策略之一,但有很多向量。

但讓我們說在一種情況下,您有FTP或SSH訪問服務器和有人妥協FTP登錄。該用戶帳戶的public_html文件夾的登錄名稱相同。該人可以瀏覽並閱讀這些文件。在這一點上它非常糟糕。但是,您可以在系統上進行配置,只將用戶監控到其主目錄。

那麼也許你可以創建一個文件夾.private該用戶的home目錄以外的一個級別。然後,在該用戶的php文件中,在public_html中擁有其腳本的用戶的php文件中包含.private文件夾中存在的連接文件(例如../../.private/connect.php)。

我不知道如果這將工作,如果用戶被監禁 - 但這種似乎通過默默無聞的東西安全。

1

建立在Cajus Kuinzinas避免的東西上......考慮使用存儲應用程序證書的受限數據庫。當您的應用程序啓動時,使用可以查找實際應用程序數據庫憑據的只讀帳戶執行查詢。

爲了使它更安全,存儲在查詢數據庫中的值不應該是完整的密碼。您的應用程序可以將此值與鹽一起散列以生成真實密碼。另外,如果需要,您可以將其緩存在內存中,以減少未來的點擊次數。