接続文字列ビルダーConnection String Builders

ADO.NETADO.NET の以前のバージョンでは、コンパイル時に文字列の値を連結した接続文字列のチェックが行われなかったために、実行時に不正なキーワードによる ArgumentException が発生していました。In earlier versions of ADO.NETADO.NET, compile-time checking of connection strings with concatenated string values did not occur, so that at run time, an incorrect keyword generated an ArgumentException. 接続文字列のキーワードの構文は .NET Framework.NET Framework のデータ プロバイダーごとに異なるため、有効な接続文字列を手動で作成するのが難しいという問題がありました。Each of the .NET Framework.NET Framework data providers supported different syntax for connection string keywords, which made constructing valid connection strings difficult if done manually. この問題に対処するため、ADO.NETADO.NET 2.0 では、各 .NET Framework.NET Framework データ プロバイダー用の新しい接続文字列ビルダーが導入されました。To address this problem, ADO.NETADO.NET 2.0 introduced new connection string builders for each .NET Framework.NET Framework data provider. 各データ プロバイダーは、DbConnectionStringBuilder から継承した、厳密に型指定された接続文字列ビルダー クラスを提供しています。Each data provider includes a strongly typed connection string builder class that inherits from DbConnectionStringBuilder. 次の表は、各 .NET Framework.NET Framework データ プロバイダーおよび対応する接続文字列ビルダー クラスの一覧です。The following table lists the .NET Framework.NET Framework data providers and their associated connection string builder classes.

プロバイダーProvider ConnectionStringBuilder クラスConnectionStringBuilder class
System.Data.SqlClient System.Data.SqlClient.SqlConnectionStringBuilder
System.Data.OleDb System.Data.OleDb.OleDbConnectionStringBuilder
System.Data.Odbc System.Data.Odbc.OdbcConnectionStringBuilder
System.Data.OracleClient System.Data.OracleClient.OracleConnectionStringBuilder

接続文字列のインジェクション攻撃Connection String Injection Attacks

ユーザー入力から文字列を動的に連結することによって接続文字列を構築している場合、接続文字列のインジェクション攻撃を受ける可能性があります。A connection string injection attack can occur when dynamic string concatenation is used to build connection strings that are based on user input. 文字列の検証や悪意のある文字のエスケープを怠ると、機密データなど、サーバー上のリソースへのアクセスを攻撃者に許してしまうことも考えられます。If the string is not validated and malicious text or characters not escaped, an attacker can potentially access sensitive data or other resources on the server. たとえば、セミコロンに続けて値を追加するだけでも攻撃が成立します。For example, an attacker could mount an attack by supplying a semicolon and appending an additional value. 接続文字列は "後勝ち" のアルゴリズムで解析されるため、悪質な入力データによって本来の値が置き換えられます。The connection string is parsed by using a "last one wins" algorithm, and the hostile input is substituted for a legitimate value.

接続文字列ビルダー クラスは推測に頼った作業を排除し、構文エラーやセキュリティ上の脆弱性を防ぐことを目的に設計されています。The connection string builder classes are designed to eliminate guesswork and protect against syntax errors and security vulnerabilities. このクラスには、各データ プロバイダーによってサポートされた既知のキーと値のペアに対応するプロパティおよびメソッドが存在します。They provide methods and properties corresponding to the known key/value pairs permitted by each data provider. それぞれのクラスは、あらかじめ決められた一連のシノニムを管理しており、特定のシノニムを対応する既知のキー名に変換することができます。Each class maintains a fixed collection of synonyms and can translate from a synonym to the corresponding well-known key name. 有効なキーと値のペアに対してチェックが実行され、無効なペアが見つかると例外がスローされます。Checks are performed for valid key/value pairs and an invalid pair throws an exception. また、挿入された値は安全な方法で処理されます。In addition, injected values are handled in a safe manner.

次の例を実行すると、SqlConnectionStringBuilder の設定に対して挿入された余分な値が、Initial Catalog によってどのように処理されるかを確認できます。The following example demonstrates how the SqlConnectionStringBuilder handles an inserted extra value for the Initial Catalog setting.

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 によって適切に処理されていることがわかります。二重引用符内の余分な値は、新しいキーと値のペアとして接続文字列に追加されるのではなくエスケープされています。The output shows that the SqlConnectionStringBuilder handled this correctly by escaping the extra value in double quotation marks instead of appending it to the connection string as a new key/value pair.

data source=(local);Integrated Security=True;  
initial catalog="AdventureWorks;NewValue=Bad"  

構成ファイルからの接続文字列の作成Building Connection Strings from Configuration Files

接続文字列の特定の要素があらかじめわかっている場合、接続文字列を構成ファイルに格納しておき、それを実行時に取得することによって完全な接続文字列を作成できます。If certain elements of a connection string are known beforehand, they can be stored in a configuration file and retrieved at run time to construct a complete connection string. たとえば、サーバー名は不明でも、データベースの名前はあらかじめ把握できる場合があります。For example, the name of the database might be known in advance, but not the name of the server. または、ユーザーに名前とパスワードだけを実行時に指定してもらい、それ以外の値を接続文字列に挿入できないようにしたい場合もあります。Or you might want a user to supply a name and password at run time without being able to inject other values into the connection string.

接続文字列ビルダーには、String を引数として受け取るオーバーロード コンストラクターがあります。この引数に対して接続文字列を部分的に指定しておき、それ以外の部分をユーザー入力で補完することも可能です。One of the overloaded constructors for a connection string builder takes a String as an argument, which enables you to supply a partial connection string that can then be completed from user input. 部分的な接続文字列は構成ファイルに保存し、実行時に取得できます。The partial connection string can be stored in a configuration file and retrieved at run time.

注意

構成ファイルへのプログラム アクセスは System.Configuration 名前空間によって実現できます。Web アプリケーションの場合は WebConfigurationManager を、Windows アプリケーションの場合は ConfigurationManager を使用します。The System.Configuration namespace allows programmatic access to configuration files that use the WebConfigurationManager for Web applications and the ConfigurationManager for Windows applications. 接続文字列と構成ファイルの操作の詳細については、次を参照してください。接続文字列と構成ファイルです。For more information about working with connection strings and configuration files, see Connection Strings and Configuration Files.

Example

この例では、接続文字列の一部を構成ファイルから取得し、DataSourceUserID プロパティ、Password プロパティ、および SqlConnectionStringBuilder プロパティを設定することによって接続文字列全体を作成します。This example demonstrates retrieving a partial connection string from a configuration file and completing it by setting the DataSource, UserID, and Password properties of the SqlConnectionStringBuilder. 構成ファイルは次のように定義されています。The configuration file is defined as follows.

<connectionStrings>  
  <clear/>  
  <add name="partialConnectString"   
    connectionString="Initial Catalog=Northwind;"  
    providerName="System.Data.SqlClient" />  
</connectionStrings>  

注意

このコードを実行するには、プロジェクトで System.Configuration.dll を参照設定する必要があります。You must set a reference to the System.Configuration.dll in your project for the code to run.

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

関連項目See Also

接続文字列Connection Strings
プライバシーとデータ セキュリティPrivacy and Data Security
ADO.NET のマネージ プロバイダーと DataSet デベロッパー センターADO.NET Managed Providers and DataSet Developer Center