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

2022-02-20 19:44:50 浏览数 (2)

规则 ID

CA2119

类别

安全性

修复是中断修复还是非中断修复

重大

原因

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

规则说明

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

如何解决冲突

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

使声明类型为 sealed(在 Visual Basic 中为 NotInheritable)。

将声明类型的可访问性更改为 internal(在 Visual Basic 中为 Friend)。

删除声明类型中的所有公共构造函数。

在不使用 virtual 修饰符的情况下实现方法。

显式实现方法。

何时禁止显示警告

如果仔细检查后,不存在在程序集外部重写此方法时可能会被利用的安全问题,则可禁止显示此规则的警告。

示例 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

另请参阅

接口 (C#)

接口 (Visual Basic)

0 人点赞