CA3007: Tinjau kode untuk kerentanan pengalihan terbuka

Properti Nilai
ID Aturan CA3007
Judul Tinjau kode untuk kerentanan pengalihan terbuka
Kategori Keamanan
Perbaikan bersifat merusak atau tidak merusak Tidak terputus
Diaktifkan secara default di .NET 10 Tidak
Bahasa yang berlaku C# dan Visual Basic

Penyebab

Input permintaan HTTP yang berpotensi tidak tepercaya mencapai pengalihan respons HTTP.

Secara default, aturan ini menganalisis seluruh codebase, tetapi ini dapat dikonfigurasi.

Deskripsi aturan

Saat bekerja dengan input yang tidak tepercaya, perhatikan kerentanan pengalihan terbuka. Penyerang dapat mengeksploitasi kerentanan pengalihan terbuka untuk menggunakan situs web Anda guna memberikan tampilan URL yang sah, tetapi mengarahkan pengunjung yang tidak curiga ke phishing atau halaman web berbahaya lainnya.

Aturan ini mencoba menemukan input dari permintaan HTTP yang mencapai URL pengalihan HTTP.

Catatan

Aturan ini tidak dapat melacak data di seluruh assembly. Misalnya, jika satu rakitan membaca input permintaan HTTP lalu meneruskannya ke rakitan lain yang merespons dengan pengalihan HTTP, aturan ini tidak akan menghasilkan peringatan.

Catatan

Ada batas yang dapat dikonfigurasi untuk seberapa dalam aturan ini akan menganalisis aliran data di seluruh panggilan metode. Lihat Konfigurasi Penganalisis untuk mengetahui cara mengonfigurasi batas pada file EditorConfig.

Cara memperbaiki pelanggaran

Beberapa pendekatan untuk memperbaiki kerentanan pengalihan terbuka meliputi:

  • Jangan izinkan pengguna untuk memulai pengalihan.
  • Jangan izinkan pengguna menentukan bagian mana pun dari URL dalam skenario pengalihan.
  • Batasi pengalihan ke "daftar izin" URL yang telah ditentukan sebelumnya.
  • Validasi URL pengalihan.
  • Jika berlaku, pertimbangkan untuk menggunakan halaman penafian saat pengguna dialihkan dari situs Anda.

Kapan harus menekan peringatan

Jika Anda tahu bahwa Anda telah memvalidasi input untuk dibatasi pada URL yang dimaksudkan, tidak apa-apa untuk menekan peringatan ini.

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 CA3007
// The code that's violating the rule is on this line.
#pragma warning restore CA3007

Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none dalam file konfigurasi.

[*.{cs,vb}]
dotnet_diagnostic.CA3007.severity = none

Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.

Mengonfigurasi kode yang akan dianalisis

Gunakan opsi berikut untuk mengonfigurasi bagian mana dari codebase Anda yang akan menjalankan aturan ini.

Anda dapat mengonfigurasi opsi ini hanya untuk aturan ini, untuk semua aturan yang dikenakan, atau untuk semua aturan dalam kategori Keamanan yang dikenakan. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.

Mengecualikan simbol tertentu

Anda dapat mengecualikan simbol tertentu, seperti jenis dan metode, dari analisis dengan mengatur opsi excluded_symbol_names. Misalnya, untuk menentukan bahwa aturan tidak boleh berjalan pada kode apa pun dalam jenis bernama MyType, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

Catatan

Ganti bagian XXXXCAXXXX dengan ID aturan yang berlaku.

Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |):

  • Nama simbol saja (menyertakan semua simbol dengan nama, terlepas dari jenis atau namespace yang memuatnya).
  • Nama yang sepenuhnya memenuhi syarat dalam format ID dokumentasi simbol. Setiap nama simbol memerlukan awalan jenis simbol, seperti M: untuk metode, T: untuk jenis, dan N: untuk namespace.
  • .ctor untuk konstruktor dan .cctor untuk konstruktor statik.

Contoh:

Nilai Opsi Ringkasan
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType Mencocokkan semua simbol bernama MyType.
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 Mencocokkan semua simbol bernama MyType1 atau MyType2.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) Mencocokkan metode tertentu MyMethod dengan tanda tangan memenuhi syarat penuh yang ditentukan.
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) Mencocokkan metode tertentu MyMethod1 dan MyMethod2 dengan tanda tangan lengkap masing-masing.

Mengecualikan jenis tertentu dan jenis turunannya

Anda dapat mengecualikan jenis tertentu dan jenis turunannya dari analisis dengan mengatur opsi excluded_type_names_with_derived_types. Misalnya, untuk menentukan bahwa aturan tidak boleh dijalankan pada metode apa pun dalam jenis bernama MyType dan jenis turunannya, tambahkan pasangan kunci-nilai berikut ke file .editorconfig di proyek Anda:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

Catatan

Ganti bagian XXXXCAXXXX dengan ID aturan yang berlaku.

Format nama simbol yang diizinkan pada nilai opsi (dipisahkan oleh |):

  • Nama jenis saja (mencakup semua jenis dengan nama, terlepas dari jenis atau namespace yang memuatnya).
  • Nama yang sepenuhnya dikualifikasi dalam format ID dokumentasi simbol, dengan awalan T: yang bersifat opsional.

Contoh:

Nilai opsi Ringkasan
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType Mencocokkan semua jenis bernama MyType dan semua jenis turunannya.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 Mencocokkan semua jenis bernama MyType1 atau MyType2 dan semua jenis turunannya.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType Mencocokkan jenis tertentu MyType dengan nama lengkap yang diberikan dan semua jenis turunannya.
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 Mencocokkan jenis tertentu MyType1 dan MyType2 dengan nama lengkap yang memenuhi syarat, serta semua jenis turunannya.

Contoh kode semu

Pelanggaran

using System;

public partial class WebForm : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string input = Request.Form["url"];
        this.Response.Redirect(input);
    }
}
Imports System

Partial Public Class WebForm
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
        Dim input As String = Me.Request.Form("url")
        Me.Response.Redirect(input)
    End Sub
End Class

Solusi

using System;

public partial class WebForm : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        string input = Request.Form["in"];
        if (String.IsNullOrWhiteSpace(input))
        {
            this.Response.Redirect("https://example.org/login.html");
        }
    }
}
Imports System

Partial Public Class WebForm
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(sender As Object, eventArgs As EventArgs)
        Dim input As String = Me.Request.Form("in")
        If String.IsNullOrWhiteSpace(input) Then
            Me.Response.Redirect("https://example.org/login.html")
        End If
    End Sub
End Class