CA2119:密封满足私有接口的方法

属性
规则 ID CA2119
标题 密封满足私有接口的方法
类别 安全性
修复是中断修复还是非中断修复 重大
在 .NET 8 中默认启用

原因

可继承的公共类型为 internal(在 Visual Basic 中为 Friend)接口提供可重写的方法实现。

规则说明

接口方法具有公共可访问性,实现类型不能对其进行更改。 internal 接口创建一个协定,该协定不应在定义接口的程序集的外部实现。 使用 virtual(在 Visual Basic 中为 Overridable)修饰符实现 internal 接口方法的公共类型允许该方法由程序集外部的派生类型重写。 如果定义程序集中的第二种类型调用该方法并需要仅限内部的协定,当在外部程序集中执行重写方法时,行为可能会受到影响。 这会造成安全漏洞。

如何解决冲突

若要解决此规则的冲突,请通过以下其中一种方式阻止方法在程序集外部重写。

  • 使声明类型为 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

另请参阅