2011-11-22 51 views
10

我目前正在研究一個ASP.NET MVC網站,而且我已經到了需要將數據庫集成到網站中的一個點。如何安全地存儲和訪問連接字符串詳細信息?

通常我只會適當的連接字符串添加到Web.config文件:

<add name="MainDB" 
    connectionString="Server=localhost; Database=TopSecretData; User Id=Joe; 
    password=password" providerName="System.Data.SqlClient" /> 

但顯然有一個明顯的安全漏洞,如果我離開我的用戶名和密碼就在Web.config,特別是當它在源控制。

簡而言之:如何保存我的連接字符串細節而不公開可見?

回答

15

最好的做法是加密連接字符串部分。使用ASPNET_REGIIS.EXE,它可以在不同的地方找到:

  • 開始 - 的Visual Studio - Visual Studio工具 - Visual Studio命令提示符
  • C:\ WINDOWS \ Microsoft.NET \框架\ v4.0.30319(確保您以管理員身份運行)

前:

<configuration> 
<connectionStrings> 
<add name="MainConnectionString" 
connectionString="data source=Ratbert;database=Sales;username=ASPNET;password=$Double_Rainbow2011" 
providerName="System.Data.SqlClient"/> 
</connectionStrings> 
</configuration> 

運行以下命令:

aspnet_regiis –pef connectionStrings c:\PathToWebSite 

或者,如果上面的命令不起作用(你得到ASPNET_REGIIS幫助文本),嘗試

aspnet_regiis -pe connectionStrings -app "/" -site 6 

其中「6」是該網站的ID爲IIS報道。

後:

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider"> 
    <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" 
    xmlns="http://www.w3.org/2001/04/xmlenc#"> 
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" /> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
    <EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#"> 
    <EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" /> 
    <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#"> 
     <KeyName>Rsa Key</KeyName> 
    </KeyInfo> 
    <CipherData> 
     <CipherValue>Bf677iFrUFW ... +4n4ZZKXCTUAu2Y=</CipherValue> 
    </CipherData> 
    </EncryptedKey> 
    </KeyInfo> 
    <CipherData> 
    <CipherValue>UDEZ ...QfXUmM5rQ==</CipherValue> 
    </CipherData> 
    </EncryptedData> 
</connectionStrings> 

現在,它是亂碼,你不能編輯它。 解密這樣的:

aspnet_regiis –pdf connectionStrings c:\PathToWebSite 

或者

aspnet_regiis -pd connectionStrings -app "/" -site 6 

,然後更改和重新加密。

要讀取連接字符串,請使用ConfigurationManager靜態類。

string connStr = 
ConfigurationManager 
.Connectionstrings["MainConnectionString"] 
.ConnectionString.ToString(); 

var myConnection = new SqlConnection(connStr); 

myConnection.Open(); 
+0

完美!這正是我正在尋找的。 –

3

一種方法是使用任何集成安全的DB計劃書,這樣口令就不是一個問題。服務器可以直接訪問服務器而不必使用密碼,但是您必須設置一個只能從Web服務器本身訪問的用戶。

例如。像MySQL這樣的數據庫允許你指定哪些服務器可以訪問它,限制其他任何地方的訪問 - 所以黑客無法從網絡服務器訪問數據庫。這大大降低了安全性,並允許您將連接字符串文件存儲在SCM中。

它仍然不是100%安全的,因爲黑客可能(通常很容易)攻擊您的Web服務器並從中查看數據庫。您可以在其他地方存儲密碼,但這只是掩蓋了問題 - 如果Web服務器可以訪問密碼,您的黑客也可以。 (注意,存儲密碼的其他地方包括註冊表,單獨的文件如.udl文件或/ etc中的某個文件)。您可以保護此文件,以便只有Web服務器用戶才能讀取它,但顯然,被黑客入侵的Web服務器可以讀取它!

因此,下一步是抽象出數據庫連接,使其位於Web服務器之外,通常的方法是擁有一個單獨的進程來存儲公開固定方法的業務邏輯(例如服務) - Web服務器只需調用完成該工作的服務並將數據返回給Web服務器代碼。

如果黑客攻擊你的web服務器,他們所能做的只是調用服務的方法,他們不會直接訪問數據庫,因此不會損壞或修改它。通常黑客對於服務方法是什麼或做什麼的暗示很少,並且服務會有相當數量的驗證代碼給所有的輸入,所以黑客創建的消息(希望)會被拒絕。 (使用時間戳,計數器等嘗試擊敗定製的消息到服務)。

這是我們用於高安全性系統的方法(使用標準操作系統安全機制,您可以通過更多的方式來保護鏈中的每個部分)。一旦我們的安全人員展示了IIS黑客攻擊,併爲他提供了一個具有管理權限的遠程shell,那麼這樣做的理由就變得非常清楚了。無論你做什麼來保護你的Web服務器上的配置是沒有意義的,如果黑客得到的。(而且這個過程非常簡單 - 既然是固定的,但是一直都有0天的漏洞利用)

1

您可以將加密連接字符串存儲在緩存中。緩存服務器是故意在另一臺服務器上的(這種通信可以限制爲1個端口,IP地址使其難以被黑客攻擊)。這將使連接字符串完全離開Web服務器,即使黑客訪問緩存,它們也會被加密。關鍵是將字符串加載到緩存中,並且可以遠程完成,因此這些連接字符串不會寫入服務器的硬盤驅動器。該代碼只根據需要解密連接字符串,並且永遠不會保留變量中的未加密字符串。