CA3001: Tinjau kode untuk kerentanan injeksi SQL
Properti | Nilai |
---|---|
ID Aturan | CA3001 |
Judul | Tinjau kode untuk kerentanan injeksi SQL |
Golongan | Keamanan |
Perbaikan bersifat disruptif atau non-disruptif | Non-disruptif |
Diaktifkan secara default di .NET 9 | No |
Input permintaan HTTP yang berpotensi tidak tepercaya mencapai teks perintah SQL.
Secara default, aturan ini menganalisis seluruh codebase, tetapi ini dapat dikonfigurasi.
Saat bekerja dengan input dan perintah SQL yang tidak dipercaya, berhati-hatilah terhadap serangan injeksi SQL. Serangan injeksi SQL dapat menjalankan perintah SQL berbahaya, menyusupi keamanan dan integritas aplikasi Anda. Teknik umum termasuk menggunakan tanda kutip tunggal atau apostrof untuk memisahkan string harfiah, dua tanda hubung untuk komentar, dan titik koma untuk akhir pernyataan. Untuk informasi selengkapnya, lihat Injeksi SQL.
Aturan ini mencoba menemukan input dari permintaan HTTP yang mencapai teks perintah SQL.
Catatan
Aturan ini tidak dapat melacak data di seluruh assembly. Misalnya, jika satu rakitan membaca input permintaan HTTP lalu meneruskannya ke rakitan lain yang menjalankan perintah SQL, 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.
Gunakan perintah SQL berparameter, atau prosedur tersimpan, dengan parameter yang berisi input yang tidak tepercaya.
Aman untuk menekan peringatan dari aturan ini jika Anda tahu bahwa input selalu divalidasi terhadap sekumpulan karakter yang aman yang diketahui.
Jika Anda hanya ingin menyembunyikan satu pelanggaran, tambahkan arahan praprosedur ke file sumber Anda untuk dinonaktifkan lalu aktifkan kembali aturannya.
#pragma warning disable CA3001
// The code that's violating the rule is on this line.
#pragma warning restore CA3001
Untuk menonaktifkan aturan untuk file, folder, atau proyek, atur tingkat keparahannya ke none
dalam file konfigurasi.
[*.{cs,vb}]
dotnet_diagnostic.CA3001.severity = none
Untuk informasi selengkapnya, lihat Cara menyembunyikan peringatan analisis kode.
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 berlaku, atau untuk semua aturan dalam kategori ini (Security) yang berlaku untuk aturan tersebut. Untuk informasi selengkapnya, lihat Opsi konfigurasi aturan kualitas kode.
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 XXXX
CAXXXX
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, danN:
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 MyMethod metode tertentu dengan tanda tangan yang sepenuhnya memenuhi syarat yang ditentukan. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Mencocokkan MyMethod1 dan MyMethod2 metode tertentu dengan masing-masing tanda tangan yang sepenuhnya memenuhi syarat. |
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 XXXX
CAXXXX
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 memenuhi syarat dalam format ID dokumentasi simbol, dengan awalan
T:
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 MyType jenis tertentu dengan nama yang sepenuhnya memenuhi syarat tertentu dan semua jenis turunannya. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Mencocokkan MyType1 dan MyType2 jenis tertentu dengan masing-masing nama yang sepenuhnya memenuhi syarat, dan semua jenis turunannya. |
using System;
using System.Data;
using System.Data.SqlClient;
namespace TestNamespace
{
public partial class WebForm : System.Web.UI.Page
{
public static string ConnectionString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.Form["product_name"];
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
SqlCommand sqlCommand = new SqlCommand()
{
CommandText = "SELECT ProductId FROM Products WHERE ProductName = '" + name + "'",
CommandType = CommandType.Text,
};
SqlDataReader reader = sqlCommand.ExecuteReader();
}
}
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Linq
Namespace VulnerableWebApp
Partial Public Class WebForm
Inherits System.Web.UI.Page
Public Property ConnectionString As String
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim name As String = Me.Request.Form("product_name")
Using connection As SqlConnection = New SqlConnection(ConnectionString)
Dim sqlCommand As SqlCommand = New SqlCommand With {.CommandText = "SELECT ProductId FROM Products WHERE ProductName = '" + name + "'",
.CommandType = CommandType.Text}
Dim reader As SqlDataReader = sqlCommand.ExecuteReader()
End Using
End Sub
End Class
End Namespace
using System;
using System.Data;
using System.Data.SqlClient;
namespace TestNamespace
{
public partial class WebForm : System.Web.UI.Page
{
public static string ConnectionString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.Form["product_name"];
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
SqlCommand sqlCommand = new SqlCommand()
{
CommandText = "SELECT ProductId FROM Products WHERE ProductName = @productName",
CommandType = CommandType.Text,
};
sqlCommand.Parameters.Add("@productName", SqlDbType.NVarChar, 128).Value = name;
SqlDataReader reader = sqlCommand.ExecuteReader();
}
}
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Linq
Namespace VulnerableWebApp
Partial Public Class WebForm
Inherits System.Web.UI.Page
Public Property ConnectionString As String
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim name As String = Me.Request.Form("product_name")
Using connection As SqlConnection = New SqlConnection(ConnectionString)
Dim sqlCommand As SqlCommand = New SqlCommand With {.CommandText = "SELECT ProductId FROM Products WHERE ProductName = @productName",
.CommandType = CommandType.Text}
sqlCommand.Parameters.Add("@productName", SqlDbType.NVarChar, 128).Value = name
Dim reader As SqlDataReader = sqlCommand.ExecuteReader()
End Using
End Sub
End Class
End Namespace
using System;
using System.Data;
using System.Data.SqlClient;
namespace TestNamespace
{
public partial class WebForm : System.Web.UI.Page
{
public static string ConnectionString { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
string name = Request.Form["product_name"];
using (SqlConnection connection = new SqlConnection(ConnectionString))
{
SqlCommand sqlCommand = new SqlCommand()
{
CommandText = "sp_GetProductIdFromName",
CommandType = CommandType.StoredProcedure,
};
sqlCommand.Parameters.Add("@productName", SqlDbType.NVarChar, 128).Value = name;
SqlDataReader reader = sqlCommand.ExecuteReader();
}
}
}
}
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Linq
Namespace VulnerableWebApp
Partial Public Class WebForm
Inherits System.Web.UI.Page
Public Property ConnectionString As String
Protected Sub Page_Load(sender As Object, e As EventArgs)
Dim name As String = Me.Request.Form("product_name")
Using connection As SqlConnection = New SqlConnection(ConnectionString)
Dim sqlCommand As SqlCommand = New SqlCommand With {.CommandText = "sp_GetProductIdFromName",
.CommandType = CommandType.StoredProcedure}
sqlCommand.Parameters.Add("@productName", SqlDbType.NVarChar, 128).Value = name
Dim reader As SqlDataReader = sqlCommand.ExecuteReader()
End Using
End Sub
End Class
End Namespace
Umpan balik .NET
.NET adalah proyek sumber terbuka. Pilih tautan untuk memberikan umpan balik: