CA3001: Granska koden för sårbarheter vid SQL-inmatning
Property | Värde |
---|---|
Regel-ID | CA3001 |
Title | Granska koden för sårbarheter i SQL-inmatning |
Kategori | Säkerhet |
Korrigeringen är icke-bakåtkompatibel | Icke-icke-bryta |
Aktiverad som standard i .NET 9 | Nej |
Orsak
Potentiellt ej betrodda HTTP-begärandeindata når ett SQL-kommandos text.
Som standard analyserar den här regeln hela kodbasen, men detta kan konfigureras.
Regelbeskrivning
När du arbetar med ej betrodda indata och SQL-kommandon bör du tänka på SQL-inmatningsattacker. En SQL-inmatningsattack kan köra skadliga SQL-kommandon, vilket äventyrar programmets säkerhet och integritet. Typiska tekniker är att använda ett enkelt citattecken eller apostrofer för att avgränsa literalsträngar, två bindestreck för en kommentar och ett semikolon för slutet av en -instruktion. Mer information finns i SQL-inmatning.
Den här regeln försöker hitta indata från HTTP-begäranden som når sql-kommandots text.
Kommentar
Den här regeln kan inte spåra data mellan sammansättningar. Om en sammansättning till exempel läser http-begärandeindata och sedan skickar den till en annan sammansättning som kör SQL-kommandot, ger den här regeln ingen varning.
Kommentar
Det finns en konfigurerbar gräns för hur djupt den här regeln ska analysera dataflödet mellan metodanrop. Se Analyserarkonfiguration för hur du konfigurerar gränsen i en EditorConfig-fil.
Så här åtgärdar du överträdelser
Använd parametriserade SQL-kommandon eller lagrade procedurer med parametrar som innehåller de ej betrodda indata.
När du ska ignorera varningar
Det är säkert att ignorera en varning från den här regeln om du vet att indata alltid verifieras mot en känd säker uppsättning tecken.
Ignorera en varning
Om du bara vill förhindra en enda överträdelse lägger du till förprocessordirektiv i källfilen för att inaktivera och aktiverar sedan regeln igen.
#pragma warning disable CA3001
// The code that's violating the rule is on this line.
#pragma warning restore CA3001
Om du vill inaktivera regeln för en fil, mapp eller ett projekt anger du dess allvarlighetsgrad till none
i konfigurationsfilen.
[*.{cs,vb}]
dotnet_diagnostic.CA3001.severity = none
Mer information finns i Så här utelämnar du kodanalysvarningar.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera dessa alternativ för bara den här regeln, för alla regler som den gäller för eller för alla regler i den här kategorin (säkerhet) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Exkludera specifika symboler
Du kan exkludera specifika symboler, till exempel typer och metoder, från analys. Om du till exempel vill ange att regeln inte ska köras på någon kod inom typer med namnet MyType
lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Endast symbolnamn (innehåller alla symboler med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format. Varje symbolnamn kräver ett symboltypprefix, till exempel
M:
för metoder,T:
för typer ochN:
för namnområden. .ctor
för konstruktorer och.cctor
statiska konstruktorer.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType |
Matchar alla symboler med namnet MyType . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2 |
Matchar alla symboler med namnet antingen MyType1 eller MyType2 . |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType) |
Matchar en specifik metod MyMethod med den angivna fullständigt kvalificerade signaturen. |
dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType) |
Matchar specifika metoder MyMethod1 och MyMethod2 med respektive fullständigt kvalificerade signaturer. |
Exkludera specifika typer och deras härledda typer
Du kan exkludera specifika typer och deras härledda typer från analys. Om du till exempel vill ange att regeln inte ska köras på några metoder inom typer som heter MyType
och deras härledda typer lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType
Tillåtna symbolnamnformat i alternativvärdet (avgränsade med |
):
- Skriv endast namn (innehåller alla typer med namnet, oavsett vilken typ eller namnrymd som innehåller).
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format, med ett valfritt
T:
prefix.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType |
Matchar alla typer med namnet MyType och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2 |
Matchar alla typer med namnet antingen MyType1 eller MyType2 och alla deras härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType |
Matchar en specifik typ MyType med ett angivet fullständigt kvalificerat namn och alla dess härledda typer. |
dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2 |
Matchar specifika typer MyType1 och MyType2 med respektive fullständigt kvalificerade namn och alla deras härledda typer. |
Exempel på pseudokod
Kränkning
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
Parametriserad lösning
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
Lösning för lagrad procedur
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