CA2119: Zapečeťte metody, které vyhovují privátním rozhraním
TypeName |
SealMethodsThatSatisfyPrivateInterfaces |
CheckId |
CA2119 |
Kategorie |
Microsoft.Security |
Narušující změna |
Narušující |
Příčina
Dědičný veřejný typ poskytuje přepisovatelnou implementaci metody rozhraní internal (Friend v jazyce Visual Basic).
Popis pravidla
Metody rozhraní mají veřejný přístup, což nelze změnit implementací typu.Rozhraní internal vytváří ujednání, jehož implementace by neměla být provedena mimo sestavení definující toto rozhraní.Veřejný typ implementující metodu rozhraní internal za použití modifikátoru virtual (Overridable v jazyce Visual Basic) umožňuje, aby byla metoda přepsána odvozeným typem mimo sestavení.Pokud druhý typ v definujícím sestavení volá metodu a očekává ujednání týkající se pouze rozhraní internal, může být chování narušeno, je-li namísto očekávané metody spuštěna metoda mimo sestavení.Takové chování ohrožuje zabezpečení.
Jak vyřešit porušení
Chcete-li opravit porušení tohoto pravidla, zabraňte přepsání metody mimo sestavení použitím jedné z následujících možností:
Použijte v deklarujícím typu klíčové slovo sealed (NotInheritable v jazyce Visual Basic).
Změňte přístupnost deklarujícího typu na internal (Friend v jazyce Visual Basic).
Odstraňte všechny veřejné konstruktory z deklarujícího typu.
Implementujte metodu bez použití modifikátoru virtual.
Implementujte metodu explicitně.
Kdy potlačit upozornění
Potlačení upozornění tohoto pravidla je bezpečné, pokud po pečlivém zvážení při přepisování metody mimo sestavení neexistují žádné zneužitelné problémy se zabezpečením.
Příklad
Následující příklad ukazuje typ, BaseImplementation, který porušuje toto pravidlo.
Imports System
Namespace SecurityLibrary
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)
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
End Namespace
using System;
namespace SecurityLibrary
{
// 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.");
}
}
}
}
using namespace System;
namespace SecurityLibrary
{
// Internal by default.
interface class IValidate
{
bool UserIsValidated();
};
public ref class BaseImplementation : public IValidate
{
public:
virtual bool UserIsValidated()
{
return false;
}
};
public ref class UseBaseImplementation
{
public:
void SecurityDecision(BaseImplementation^ someImplementation)
{
if(someImplementation->UserIsValidated() == true)
{
Console::WriteLine("Account number & balance.");
}
else
{
Console::WriteLine("Please login.");
}
}
};
}
Následující příklad zneužívá implementaci virtuální metody z předchozího příkladu.
Imports System
Namespace SecurityLibrary
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)
Console.WriteLine("Account number & balance.")
Else
Console.WriteLine("Please login.")
End If
End Sub
End Class
End Namespace
using System;
namespace SecurityLibrary
{
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.");
}
}
}
}
using namespace System;
namespace SecurityLibrary
{
public ref class BaseImplementation
{
public:
virtual bool UserIsValidated()
{
return false;
}
};
public ref class UseBaseImplementation
{
public:
void SecurityDecision(BaseImplementation^ someImplementation)
{
if(someImplementation->UserIsValidated() == true)
{
Console::WriteLine("Account number & balance.");
}
else
{
Console::WriteLine("Please login.");
}
}
};
}
Viz také
Referenční dokumentace
Rozhraní (Průvodce programováním v C#)