C# SQL 注入(inject)

标签 c# sql-server wpf

我正在使用连接到 SQL Server 数据库的 C# 应用程序。我听说过数据的安全性,所以我决定在 SQL Server 中使用存储过程。

我的问题是,在 SQL Server 中创建存储过程后,我的 C# 代码是否受到保护以防止 SQL 注入(inject)?我使用了正确的代码吗?

SqlConnection con = new SqlConnection("Server = localhost;Database = test; Integrated Security = true");

SqlDataAdapter da = new SqlDataAdapter("selectdhena", con); // Using a Store Procedure.
da.SelectCommand.CommandType = CommandType.StoredProcedure; 

DataTable dt = new DataTable("dtLista");
da.SelectCommand.Parameters.AddWithValue("@full_name", txt.Text); 

dtg.ItemsSource = dt.DefaultView;
da.Fill(dt);  

最佳答案

简短回答:您使用了正确的代码。存储过程可以防止注入(inject)攻击。仅当您在存储过程中使用 EXEC 时,例如:

CREATE PROCEDURE dbo.CreateUserTable
    @data systemData
AS
    EXEC('CREATE TABLE ' + @data + ' (column1 varchar(100), column2 varchar(100))');
GO

攻击者可以向应用程序中注入(inject)一些设置数据的代码

a(c1 int); SHUTDOWN WITH NOWAIT;-- 

那会停止 SQL Server。所以在你的存储过程中最好有一些检查逻辑:

CREATE PROCEDURE dbo.AlterUserTable
    @data systemData
AS
    IF EXISTS(SELECT * 
              FROM INFORMATION_SCHEMA.TABLES
              WHERE TABLE_SCHEMA = 'dbo'
                AND TABLE_TYPE = 'BASE TABLE'
                AND TABLE_NAME = @data)
BEGIN
    // The table is known to exist
    // construct the appropriate command here
END
GO

关于C# SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37100669/

相关文章:

C# 枚举 - 可能有双重 ID

c# - 如何比较和存储比较元素形成一维和二维数组 c#?

c# - 在程序集中嵌入 Global.asax

sql-server - 存储过程中 IN 运算符导致数据类型 nvarchar 转换为 bigint 时出错

c# - 使用参数化连接时是否需要关闭连接

c# - 编写此控件的最佳方法?

c# - 如何在 mysql 中使用触发器将列的值从特定日期更新到仅针对唯一客户 ID 的日期

c# - 从 SQL Server 检索 blob 数据的最有效内存方式

c# - 将 SolidColorBrush 绑定(bind)到背景,绑定(bind)错误

c# - 是否值得实现 IDataErrorInfo?