連接字串建立器
適用於:.NET Framework .NET .NET Standard
在舊版 ADO.NET 中,系統不會在編譯時間檢查含有串連字串值的連接字串,因此在執行階段,不正確的關鍵字就會產生 ArgumentException。 Microsoft SqlClient Data Provider for SQL Server 包括繼承自 DbConnectionStringBuilder (部分機器翻譯) 的連接字串建立器類別 Microsoft.Data.SqlClient.SqlConnectionStringBuilder (部分機器翻譯)。
連接字串插入式攻擊
當使用動態字串串連產生根據使用者輸入而來的連接字串時,就可能發生連接字串隱碼攻擊。 如果字串未經驗證且未逸出惡意的文字或字元,攻擊者就可能得以存取伺服器上的敏感性資料或其他資源。 例如,攻擊者可以透過提供分號並附加其他值來發動攻擊。 連接字串會使用「最後一個獲勝」演算法進行剖析,並將惡意的輸入取代為合法的值。
連接字串產生器類別的目的是排除不確定性,並可防止語法錯誤和安全性漏洞。 其提供對應至資料提供者所允許之已知機碼/值組的方法與屬性。 每個類別都會維持固定的同義資料表 (Synonym) 集合,且可從同義資料表轉譯為相對應的已知索引鍵名稱。 系統將針對有效的機碼/值組執行檢查,無效的機碼/值組將擲回例外狀況。 此外,插入的值也會以安全的方式處理。
下列範例示範 SqlConnectionStringBuilder 如何針對 Initial Catalog
設定而處理插入的額外值。
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder();
builder.DataSource = "(local)";
builder.IntegratedSecurity = true;
builder.InitialCatalog = "AdventureWorks;NewValue=Bad";
Console.WriteLine(builder.ConnectionString);
輸出顯示 SqlConnectionStringBuilder 進行正確處理的方式是,使用雙引號來逸出額外的值,而不是將其附加至連接字串以作為新的機碼/值組。
data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"
從組態檔建置連接字串
如果事先知道連接字串的特定項目,就可以先將其儲存在組態檔中,執行階段時再進行擷取,用以建構完整的連接字串。 例如,您可能會預先知道資料庫的名稱,但不知道伺服器的名稱; 或者,也可以讓使用者在執行階段提供名稱與密碼,但不授與該使用者將其他值插入連接字串的能力。
連接字串產生器其中一個多載建構函式會採用 String 做為引數,這可讓您先提供部分連接字串,然後藉由使用者輸入完成。 部分連接字串可以儲存在組態檔中,並在執行階段進行擷取。
注意
System.Configuration 命名空間可讓您以程式設計方式存取使用 WebConfigurationManager (Web 應用程式) 和 ConfigurationManager (Windows 應用程式) 的組態檔。 如需使用連接字串與組態檔的詳細資訊,請參閱連接字串與組態檔。
範例
這個範例示範如何從組態檔擷取部分的連接字串,然後藉由設定 DataSource 的 UserID、Password 和 SqlConnectionStringBuilder 屬性加以完成。 組態檔的定義如下。
<connectionStrings>
<clear/>
<add name="partialConnectString"
connectionString="Initial Catalog=Northwind;"
providerName="Microsoft.Data.SqlClient" />
</connectionStrings>
注意
您必須在專案中將參考設定至 System.Configuration.dll
,程式碼才能執行。
private static void BuildConnectionString(string dataSource,
string userName, string userPassword)
{
// Retrieve the partial connection string named databaseConnection
// from the application's app.config or web.config file.
ConnectionStringSettings settings =
ConfigurationManager.ConnectionStrings["partialConnectString"];
if (null != settings)
{
// Retrieve the partial connection string.
string connectString = settings.ConnectionString;
Console.WriteLine("Original: {0}", connectString);
// Create a new SqlConnectionStringBuilder based on the
// partial connection string retrieved from the config file.
SqlConnectionStringBuilder builder =
new SqlConnectionStringBuilder(connectString);
// Supply the additional values.
builder.DataSource = dataSource;
builder.UserID = userName;
builder.Password = userPassword;
Console.WriteLine("Modified: {0}", builder.ConnectionString);
}
}