我正在使用连接到 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/