次の方法で共有


安全な ADO.NET 接続

アプリケーションのセキュリティを検討する上で、データ ソースへのアクセスを保護することは、最も重要な目標の 1 つです。データ ソースへのアクセスを制限するには、ユーザー ID、パスワード、データ ソース名などの接続情報を秘密にしておくことが必須となります。重要な接続情報を秘密にしておくためのガイドラインを次に示します。

ユーザー ID とパスワードを平文に保存しない

ユーザー ID とパスワードを平文に保存すると、セキュリティに深刻な影響があります。ユーザー ID とパスワードがソース コードに含まれている場合、ソース コードが少しでも危険にさらされていると、セキュリティは脆弱になります。外部ソースに提供するのがコンパイル後のソース コードであっても、コンパイル済みコードは逆アセンブルできるため、ユーザー ID とパスワードは危険にさらされてしまいます。そのため、ユーザー ID やパスワードなどの重要な情報は、コードに平文で入れておかないようにする必要があります。

ユーザー ID とパスワード情報を秘密にするために、暗号を使用することもできます (「暗号サービス」を参照)。しかし、キー情報を保存したり、機密情報をアプリケーションとは別に保存したりする場合は、NTFS アクセス許可を使用して厳重に保護する必要があります。

Microsoft SQL Server に接続する場合は、統合セキュリティを使用することもできます。統合セキュリティは、ユーザー ID とパスワードではなく、現在のアクティブなユーザーの ID を使用します。この "統合セキュリティ" 機能を使用することを、強くお勧めします。

メモ   ASP.NET 開発者は、"統合セキュリティ" を使用する場合に、特別な注意が必要になります。ASP.NET アプリケーションで現在のアクティブなユーザーの ID を制御する方法については、「ASP.NET の偽装」を参照してください。

OleDbConnection の接続情報は、UDL (Universal Data Link) ファイルを使用して提供できます。UDL ファイルはアプリケーションの外部リソースなので、NTFS (New Technologies File System) のファイル アクセス許可機能を使用して UDL ファイルを保護し、接続情報が公開または変更されるのを防ぐ必要があります。また、接続に正しい UDL ファイルが使用されるようにするために、絶対パスを指定してください。

UDL ファイルは暗号化されません。接続情報のセキュリティをより強化するために暗号を使用する場合は、UDL ファイルで接続文字列情報を提供することはできません。

Persist Security Info を false のままにしておく

Persist Security Infotrue または yes に設定すると、ユーザー ID やパスワードなどのセキュリティ関連情報は、接続を開いた後も、接続から取得できます。接続時にユーザー ID とパスワードを渡している場合には、接続を開いた後でその情報を破棄することが最も安全です。つまり、セキュリティを向上させる方法は、Persist Security Infofalse または no に設定することです。

このことは、開いた状態の接続を信頼されていないソースに提供したり、接続情報をディスクに保持している場合に特に重要です。Persist Security Infofalse のままにしておけば、信頼されていないソースは接続用のセキュリティ関連情報にアクセスできず、セキュリティ関連情報が接続文字列情報と共にディスクに保存されることもありません。

Persist Security Info は、既定では false に設定されています。

ユーザー入力から接続文字列を作成する場合に注意する

外部ソースからの接続文字列情報 (ユーザーが入力するユーザー ID やパスワードなど) を受け取る場合は、接続文字列の作成に使用する値に、接続の動作を変更してしまうような接続文字列パラメータが含まれていないことを確認する必要があります。安全な接続文字列を作成するには、外部ソースからの入力を検証して、正しい書式に従っていることを確認してください。

入力の検証

正規表現を使用して、入力が特定の書式と一致していることを検証できます。.NET Framework には、正規表現を使って値を検証するための Regex オブジェクトが用意されています。たとえば、次のコードは、ユーザー ID 値が 8 文字の英数字文字列かどうかを確認します。

Public Static Function ValidateUserid(inString As String) As Boolean
  Dim r As Regex = New Regex("^[A-Za-z0-9]{8}$")
  Return r.IsMatch(inString)
End Function
[C#]
public static bool ValidateUserid(string inString)
{
  Regex r = new Regex("^[A-Za-z0-9]{8}$");
  return r.IsMatch(inString)
}

参照

安全な ADO.NET コードの作成