接続文字列ビルダー
適用対象: .NET Framework .NET .NET Standard
以前のバージョンの ADO.NET では、文字列値の連結によって構築された接続文字列がコンパイル時にはチェックされなかったため、実行時に、不適切なキーワードにより ArgumentException が生成されていました。 Microsoft SqlClient Data Provider for SQL Server には、DbConnectionStringBuilder から継承される、接続文字列ビルダー クラス Microsoft.Data.SqlClient.SqlConnectionStringBuilder が含まれています。
接続文字列のインジェクション攻撃
ユーザー入力から文字列を動的に連結することによって接続文字列を構築している場合、接続文字列のインジェクション攻撃を受ける可能性があります。 文字列が検証されていない場合や、悪意のあるテキストや文字がエスケープされていない場合は、攻撃者がサーバー上の機密データや他のリソースにアクセスできるおそれがあります。 たとえば、攻撃者はセミコロンを指定し、別の値を追加して攻撃を開始することができます。 接続文字列は "ラスト ワン ウィン" アルゴリズムを使用して解析され、悪意のある入力は正しい値に置き換えられます。
接続文字列ビルダー クラスは推測に頼った作業を排除し、構文エラーやセキュリティ上の脆弱性を防ぐことを目的に設計されています。 これらによって、データ プロバイダーによって許可されている既知のキーと値のペアに対応するメソッドとプロパティが提供されます。 それぞれのクラスは、あらかじめ決められた一連のシノニムを管理しており、特定のシノニムを対応する既知のキー名に変換することができます。 有効なキーと値のペアのチェックが行われ、無効なペアにより例外がスローされます。 また、挿入された値は安全な方法で処理されます。
次の例を実行すると、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 を引数として受け取るオーバーロード コンストラクターがあります。この引数に対して接続文字列を部分的に指定しておき、それ以外の部分をユーザー入力で補完することも可能です。 部分的な接続文字列は構成ファイルに保存し、実行時に取得できます。
Note
構成ファイルへのプログラム アクセスは System.Configuration 名前空間によって実現できます。Web アプリケーションの場合は WebConfigurationManager を、Windows アプリケーションの場合は ConfigurationManager を使用します。 接続文字列と構成ファイルの使用について詳しくは、「接続文字列と構成ファイル」をご覧ください。
例
この例では、接続文字列の一部を構成ファイルから取得し、DataSource の UserID プロパティ、Password プロパティ、および SqlConnectionStringBuilder プロパティを設定することによって接続文字列全体を作成します。 構成ファイルは次のように定義されています。
<connectionStrings>
<clear/>
<add name="partialConnectString"
connectionString="Initial Catalog=Northwind;"
providerName="Microsoft.Data.SqlClient" />
</connectionStrings>
Note
このコードを実行するには、プロジェクトで 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);
}
}