CA2119:プライベート インターフェイスを満たすメソッドをシールします
プロパティ | 値 |
---|---|
ルール ID | CA2119 |
Title | プライベート インターフェイスを満たすメソッドをシールします |
[カテゴリ] | Security |
修正が中断か中断なしであるか | あり |
.NET 8 では既定で有効 | いいえ |
原因
継承可能なパブリック型により、internal
(Visual Basic では Friend
) インターフェイスのオーバーライド可能なメソッド実装が提供されます。
規則の説明
インターフェイス メソッドにはパブリック アクセシビリティがありますが、実装元の型によって変更することはできません。 内部インターフェイスでは、インターフェイスを定義するアセンブリの外部で実装されることを意図しないコントラクトが作成されます。 virtual
(Visual Basic では Overridable
) を修飾子を使用して内部インターフェイスのメソッドを実装するパブリック型では、アセンブリの外部の派生型によってメソッドをオーバーライドできます。 定義元のアセンブリの 2 番目の型がそのメソッドを呼び出し、内部専用のコントラクトを期待する場合、代わりに外部アセンブリ内のオーバーライドされたメソッドが実行されると、動作が侵害される可能性があります。 これにより、セキュリティの脆弱性が生じます。
違反の修正方法
この規則違反を修正するには、以下のいずれかを使用して、アセンブリの外側でメソッドがオーバーライドされないようにします。
宣言する型を
sealed
(Visual Basic ではNotInheritable
) にします。宣言する型のアクセシビリティを
internal
(Visual Basic ではFriend
) に変更します。宣言する型からすべてのパブリック コンストラクターを削除します。
virtual
修飾子を使用せずにメソッドを実装します。メソッドを明示的に実装します。
どのようなときに警告を抑制するか
慎重にレビューした後、メソッドがアセンブリの外部でオーバーライドされた場合に悪用される可能性があるセキュリティ上の問題が存在しない場合は、この規則による警告を抑制できます。
警告を抑制する
単一の違反を抑制するだけの場合は、ソース ファイルにプリプロセッサ ディレクティブを追加して無効にしてから、規則をもう一度有効にします。
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
ファイル、フォルダー、またはプロジェクトの規則を無効にするには、構成ファイルでその重要度を none
に設定します。
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
詳細については、「コード分析の警告を抑制する方法」を参照してください。
例 1
次の例は、この規則に違反する型 BaseImplementation
を示しています。
// Internal by default.
interface IValidate
{
bool UserIsValidated();
}
public class BaseImplementation : IValidate
{
public virtual bool UserIsValidated()
{
return false;
}
}
public class UseBaseImplementation
{
public void SecurityDecision(BaseImplementation someImplementation)
{
if (someImplementation.UserIsValidated() == true)
{
Console.WriteLine("Account number & balance.");
}
else
{
Console.WriteLine("Please login.");
}
}
}
Interface IValidate
Function UserIsValidated() As Boolean
End Interface
Public Class BaseImplementation
Implements IValidate
Overridable Function UserIsValidated() As Boolean _
Implements IValidate.UserIsValidated
Return False
End Function
End Class
Public Class UseBaseImplementation
Sub SecurityDecision(someImplementation As BaseImplementation)
If (someImplementation.UserIsValidated() = True) Then
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
例 2
次の例は、前の例の仮想メソッドの実装を悪用しています。
public class BaseImplementation
{
public virtual bool UserIsValidated()
{
return false;
}
}
public class UseBaseImplementation
{
public void SecurityDecision(BaseImplementation someImplementation)
{
if (someImplementation.UserIsValidated() == true)
{
Console.WriteLine("Account number & balance.");
}
else
{
Console.WriteLine("Please login.");
}
}
}
Public Class BaseImplementation
Overridable Function UserIsValidated() As Boolean
Return False
End Function
End Class
Public Class UseBaseImplementation
Sub SecurityDecision(someImplementation As BaseImplementation)
If (someImplementation.UserIsValidated() = True) Then
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
関連項目
.NET