連接字串產生器 (ADO.NET)
更新: November 2007
在 ADO.NET 先前的版本中,不會發生在編譯時間檢查含有串連字串值的連接字串的情況,因此在執行階段不正確的關鍵字會產生 ArgumentException。每個 .NET Framework 資料提供者都支援不同語法的連接字串關鍵字,導致人工建構有效連接字串的難度大為增加。為了處理這個問題,ADO.NET 2.0 為每個 .NET Framework 資料提供者導入了全新的連接字串產生器 (Builder)。每個資料提供者都具有繼承自 DbConnectionStringBuilder 強型別連接字串產生器類別。下表列出 .NET Framework 資料提供者和其相關的連接字串產生器類別。
提供者 |
ConnectionStringBuilder 類別 |
---|---|
連接字串插入式攻擊
當使用動態字串串連產生根據使用者輸入而來的連接字串時,就可能發生連接字串隱碼攻擊。如果字串未經驗證且未逸出惡意的文字或字元,攻擊者就可能得以存取伺服器上的機密資料或其他資源。例如,攻擊者可以藉由提供分號並附加額外的值而掛上 (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);
輸出顯示上述情況的正確處理方式:SqlConnectionStringBuilder 以雙引號溢出額外值,而非以新的索引鍵/值組將該值附加到連接字串。
data source=(local);Integrated Security=True;
initial catalog="AdventureWorks;NewValue=Bad"
從組態檔建置連接字串
如果事先知道連接字串的特定項目,就可以先將其儲存在組態檔中,執行階段時再進行擷取,用以建構完整的連接字串。例如,您可能會預先知道資料庫的名稱,但不知道伺服器的名稱;或者,也可以讓使用者在執行階段提供名稱和密碼,但不能將其他值插入連接字串。
連接字串產生器其中一個多載建構函式會採用 String 做為引數,這可讓您先提供部分連接字串,然後藉由使用者輸入完成。部分連接字串可以儲存在組態檔中,並在執行階段進行擷取。
注意事項: |
---|
System.Configuration 命名空間可讓您以程式設計方式存取使用 WebConfigurationManager (Web 應用程式) 和 ConfigurationManager (Windows 應用程式) 的組態檔。如需使用連接字串和組態檔的詳細資訊,請參閱連接字串和組態檔 (ADO.NET)。 |
範例
這個範例示範如何從組態檔擷取部分的連接字串,然後藉由設定 SqlConnectionStringBuilder 的 DataSource、UserID 和 Password 屬性加以完成。組態檔的定義如下。
<connectionStrings>
<clear/>
<add name="partialConnectString"
connectionString="Initial Catalog=Northwind;"
providerName="System.Data.SqlClient" />
</connectionStrings>
注意事項: |
---|
您必須在專案中將參考設定至 System.Configuration.dll,程式碼才能執行。 |
Private Sub BuildConnectionString(ByVal dataSource As String, _
ByVal userName As String, ByVal userPassword As String)
' Retrieve the partial connection string named databaseConnection
' from the application's app.config or web.config file.
Dim settings As ConnectionStringSettings = _
ConfigurationManager.ConnectionStrings("partialConnectString")
If Not settings Is Nothing Then
' Retrieve the partial connection string.
Dim connectString As String = settings.ConnectionString
Console.WriteLine("Original: {0}", connectString)
' Create a new SqlConnectionStringBuilder based on the
' partial connection string retrieved from the config file.
Dim builder As New SqlConnectionStringBuilder(connectString)
' Supply the additional values.
builder.DataSource = dataSource
builder.UserID = userName
builder.Password = userPassword
Console.WriteLine("Modified: {0}", builder.ConnectionString)
End If
End Sub
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);
}
}