連接字串建立器
在舊版 ADO.NET 中,系統不會在編譯時間檢查含有串連字串值的連接字串,因此在執行階段,不正確的關鍵字就會產生 ArgumentException。 每個 .NET Framework 資料提供者都支援不同語法的連接字串關鍵字,導致人工建構有效連接字串的難度大為增加。 為了處理這個問題,ADO.NET 2.0 為每個 .NET Framework 資料提供者導入了全新的連接字串產生器。 每個資料提供者都具有繼承自 DbConnectionStringBuilder 強型別連接字串產生器類別。 下表列出 .NET Framework 資料提供者與其相關的連接字串產生器類別。
連接字串插入式攻擊
當使用動態字串串連產生根據使用者輸入而來的連接字串時,就可能發生連接字串隱碼攻擊。 如果字串未經驗證且未逸出惡意的文字或字元,攻擊者就可能得以存取伺服器上的機密資料或其他資源。 例如,攻擊者可以藉由提供分號並附加額外的值而掛上 (Mount) 攻擊。 連接字串會受到「最後一個設定」演算法剖析,而惡意的輸入值會取代合法的值。
連接字串產生器類別的目的是排除不確定性,並可防止語法錯誤和安全性漏洞。 此類別所提供的方法和屬性都對應於每個資料提供者所允許的已知索引鍵/值配對。 每個類別都會維持固定的同義資料表 (Synonym) 集合,且可從同義資料表轉譯為相對應的已知索引鍵名稱。 系統將針對有效的索引鍵/值組執行檢查,無效的索引鍵/值組將擲回例外狀況 (Exception)。 此外,插入的值也會以安全的方式處理。
下列範例示範 SqlConnectionStringBuilder 如何針對 Initial Catalog
設定而處理插入的額外值。
Dim builder As New System.Data.SqlClient.SqlConnectionStringBuilder
builder("Data Source") = "(local)"
builder("Integrated Security") = True
builder("Initial Catalog") = "AdventureWorks;NewValue=Bad"
Console.WriteLine(builder.ConnectionString)
System.Data.SqlClient.SqlConnectionStringBuilder builder =
new System.Data.SqlClient.SqlConnectionStringBuilder();
builder["Data Source"] = "(local)";
builder["integrated Security"] = true;
builder["Initial Catalog"] = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);
重要
Microsoft建議您使用可用的最安全驗證流程。 如果您正在連接 Azure SQL,建議使用的驗證方法為 Azure 資源受控識別。
輸出顯示上述情況的正確處理方式:SqlConnectionStringBuilder 以雙引號溢出額外值,而非以新的索引鍵/值組將該值附加到連接字串。
data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"
從組態檔建置連接字串
如果事先知道連接字串的特定項目,就可以先將其儲存在組態檔中,執行階段時再進行擷取,用以建構完整的連接字串。 例如,您可能會預先知道資料庫的名稱,但不知道伺服器的名稱;
連接字串產生器其中一個多載建構函式會採用 String 做為引數,這可讓您先提供部分連接字串,然後藉由使用者輸入完成。 部分連接字串可以儲存在組態檔中,並在執行階段進行擷取。
注意
System.Configuration 命名空間可讓您以程式設計方式存取使用 WebConfigurationManager (Web 應用程式) 和 ConfigurationManager (Windows 應用程式) 的組態檔。 如需使用連接字串與組態檔的詳細資訊,請參閱連接字串與組態檔。
另請參閱
- 連接字串
- 隱私權和資料安全性
- ADO.NET 概觀 \(部分機器翻譯\)