Bagikan melalui


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 8 Tidak

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

Baca juga