值
规则 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)