CA2119: Metode penyegelan yang memenuhi antarmuka privat
Properti | Nilai |
---|---|
ID Aturan | CA2119 |
Judul | Segel metode yang memenuhi antarmuka privat |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Merusak |
Diaktifkan secara default di .NET 9 | No |
Penyebab
Jenis publik yang dapat diwariskan menyediakan implementasi metode yang internal
dapat diganti dari antarmuka (Friend
di Visual Basic).
Deskripsi aturan
Metode antarmuka memiliki aksesibilitas publik, yang tidak dapat diubah oleh jenis penerapan. Antarmuka internal membuat kontrak yang tidak dimaksudkan untuk diimplementasikan di luar assembly yang mendefinisikan antarmuka. Jenis publik yang mengimplementasikan metode antarmuka internal menggunakan virtual
pengubah (Overridable
di Visual Basic) memungkinkan metode untuk ditimpa oleh jenis turunan yang berada di luar rakitan. Jika jenis kedua dalam rakitan yang mendefinisikan memanggil metode dan mengharapkan kontrak internal saja, perilaku mungkin disusupi ketika, sebaliknya, metode yang ditimpa di rakitan luar dijalankan. Ini menciptakan kerentanan keamanan.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, cegah metode ditimpa di luar rakitan dengan menggunakan salah satu hal berikut:
Buat jenis
sealed
deklarasikan (NotInheritable
di Visual Basic).Ubah aksesibilitas jenis deklarasikan menjadi
internal
(Friend
di Visual Basic).Hapus semua konstruktor publik dari jenis deklarasikan.
Terapkan metode tanpa menggunakan pengubah
virtual
.Terapkan metode secara eksplisit.
Kapan harus menekan peringatan
Aman untuk menekan peringatan dari aturan ini jika, setelah tinjauan yang cermat, tidak ada masalah keamanan yang mungkin dapat dieksploitasi jika metode ditimpa di luar rakitan.
Menyembunyikan peringatan
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA2119
// The code that's violating the rule is on this line.
#pragma warning restore CA2119
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA2119.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
Contoh 1
Contoh berikut menunjukkan jenis, BaseImplementation
, yang melanggar aturan ini.
// 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
Contoh 2
Contoh berikut mengeksploitasi implementasi metode virtual dari contoh sebelumnya.
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