連接字串建立器

適用於:.NET Framework .NET .NET Standard

下載 ADO.NET

在舊版 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 應用程式) 的組態檔。 如需使用連接字串與組態檔的詳細資訊,請參閱連接字串與組態檔

範例

這個範例示範如何從組態檔擷取部分的連接字串,然後藉由設定 DataSourceUserIDPasswordSqlConnectionStringBuilder 屬性加以完成。 組態檔的定義如下。

<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);
    }
}

另請參閱