首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CA3001:查看 SQL 注入漏洞的代码

CA3001:查看 SQL 注入漏洞的代码

作者头像
呆呆
发布2022-02-20 19:48:41
发布2022-02-20 19:48:41
8250
举报
文章被收录于专栏:centosDaicentosDai

规则 ID

CA3001

类别

安全性

修复是中断修复还是非中断修复

非中断

原因

可能有不受信任的 HTTP 请求输入进入 SQL 命令文本。

默认情况下,此规则会分析整个代码库,但这是可配置的。

规则说明

使用不受信任的输入和 SQL 命令时,请注意防范 SQL 注入攻击。 SQL 注入攻击可以执行恶意的 SQL 命令,从而降低应用程序的安全性和完整性。 典型的技术包括使用单引号或撇号分隔文本字符串,在注释中使用两个短划线,以及在语句末尾使用分号。 有关详细信息,请参阅 SQL Injection。

此规则试图查找 HTTP 请求中要进入 SQL 命令文本的输入。

备注

此规则无法跨程序集跟踪数据。 例如,如果一个程序集读取 HTTP 请求输入,然后将其传递给另一个执行 SQL 命令的程序集,则此规则不会产生警告。

备注

对于此规则跨方法调用分析数据流的深入程度存在限制,此限制是可配置的。 若要了解如何在 EditorConfig 文件中配置此限制,请参阅分析器配置。

如何解决冲突

通过将不受信任的输入包含在参数中,使用参数化的 SQL 命令或存储过程。

何时禁止显示警告

如果你确定输入始终针对已知安全的一组字符进行验证,则禁止显示此规则的警告是安全的。

配置代码以进行分析

使用下面的选项来配置代码库的哪些部分要运行此规则。

排除特定符号

排除特定类型及其派生类型

你可以仅为此规则、为所有规则或为此类别(安全性)中的所有规则配置这些选项。 有关详细信息,请参阅代码质量规则配置选项。

排除特定符号

可以从分析中排除特定符号,如类型和方法。 例如,若要指定规则不应针对名为 MyType 的类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

选项值中允许的符号名称格式(用 | 分隔):

仅符号名称(包括具有相应名称的所有符号,不考虑包含的类型或命名空间)。

完全限定的名称,使用符号的文档 ID 格式。 每个符号名称都需要带有一个符号类型前缀,例如表示方法的 M:、表示类型的 T:,以及表示命名空间的 N:。

.ctor 表示构造函数,.cctor 表示静态构造函数。

示例:

选项值

总结

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType

匹配名为 MyType 的所有符号。

dotnet_code_quality.CAXXXX.excluded_symbol_names = MyType1|MyType2

匹配名为 MyType1 或 MyType2 的所有符号。

dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS.MyType.MyMethod(ParamType)

匹配带有指定的完全限定签名的特定方法 MyMethod。

dotnet_code_quality.CAXXXX.excluded_symbol_names = M:NS1.MyType1.MyMethod1(ParamType)|M:NS2.MyType2.MyMethod2(ParamType)

匹配带有各自的完全限定签名的特定方法 MyMethod1 和 MyMethod2。

排除特定类型及其派生类型

可以从分析中排除特定类型及其派生类型。 例如,若要指定规则不应针对名为 MyType 的类型及其派生类型中的任何代码运行,请将以下键值对添加到项目中的 .editorconfig 文件:

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

选项值中允许的符号名称格式(用 | 分隔):

仅类型名称(包括具有相应名称的所有类型,不考虑包含的类型或命名空间)。

完全限定的名称,使用符号的文档 ID 格式,前缀为 T:(可选)。

示例:

选项值

总结

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType

匹配名为 MyType 的所有类型及其所有派生类型。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = MyType1|MyType2

匹配名为 MyType1 或 MyType2 的所有类型及其所有派生类型。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS.MyType

匹配带有给定的完全限定名称的特定类型 MyType 及其所有派生类型。

dotnet_code_quality.CAXXXX.excluded_type_names_with_derived_types = M:NS1.MyType1|M:NS2.MyType2

匹配带有各自的完全限定名称的特定类型 MyType1 和 MyType2 及其所有派生类型。

伪代码示例

冲突

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

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档