CS.DB.CLOSE.FINALLY
'finally' ブロックでデータベース接続を閉じます。
この規則は、特定の接続型からの閉鎖メソッドの呼び出しが 'finally' ブロックに存在しない場合に常にトリガーします。リソースが 'using' ステートメントを介して使用される場合、規則はトリガーしません。
これらの型ごとに、型名と閉鎖メソッド名のリストを指定できます。完全な型名 (正規表現として): 規則によって、その閉鎖メソッドの呼び出しが finally ブロック内に配置されていることが保証される場合の、その型の完全な名前。
メソッド (正規表現として): リソースを閉じるために使用されるメソッドの名前。接続型が先祖クラスからの閉鎖メソッドをオーバーライドする場合、'完全な型名' パラメーターで、このメソッドを実装している最初の先祖クラスの名前を指定する必要があります。
脆弱性とリスク
データベース接続を閉じて解放することに失敗すると、他のユーザーに接続を長く待機させる原因となる可能性があります。接続が閉じていない状態のままである場合、他のユーザーは接続がデータベースから返されることを待機しなければならない場合があります。
軽減と防止
例外やエラーの状態であっても、すべての場合で DB リソースを閉じて解放するように、コードが構造化されていることを確認してください。finally ブロックに close ステートメントを含めることで、メソッドはすべての状況で呼び出されることになります。
脆弱コード例
コピー
using System.Data.SqlClient;
namespace myApplication
{
class MyClientApplication
{
public void myMethod(SqlConnection connection)
{
try
{
connection.Open() ;
// do some thing
}
catch(Exception exc)
{
//Handle error
}
connection.Close(); // VIOLATION
}
}
}
修正コード例
コピー
using System.Data.SqlClient;
namespace myApplication
{
class MyClientApplication
{
public void myMethod(SqlConnection connection)
{
try
{
connection.Open();
// do some thing
}
catch(Exception exc)
{
//Handle error
}
finally
{
connection.Close(); // FIX
}
}
}
}