2016-05-08 4 views
4

Я работаю с приложением C#, подключенным к базе данных SQL Server. Я слышал о безопасности данных, поэтому решил работать с хранимой процедурой в SQL Server.C# SQL injection

Вопрос: после того, как я создал хранимые процедуры в SQL Server, является ли мой код на C# защищенным или нет, чтобы предотвратить SQL-инъекцию? Я использовал правильный код?

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); 
+3

Да, но, пожалуйста, не используйте AddWithValue. Используйте правильный Add с SqlDbType и ожидаемым размером параметра – Steve

+0

Не могли бы вы привести мне пример, потому что я новичок в C# – user5827232

+4

Нет необходимости использовать хранимые процедуры, чтобы избежать атак SQL-инъекций - просто использовать параметризованный SQL в порядке. –

ответ

2

Короткий ответ: вы используете правильный код. Хранимые процедуры защищены от инъекционных атак. Только если вы используете EXEC внутри хранимой процедуры, например:

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

злоумышленник может внедрить в приложение код, который устанавливает данные, которые должны быть

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