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

関連項目