Внедрение SQL обычно, когда команда SQL строится с использованием неанизированных входных данных.Например ...
var sql = "SELECT * FROM MYTABLE WHERE MYCOLUMN = " + txtInput.Text;
var cmd = new SqlCommand(sql);
...
Используя хранимую процедуру в том виде, в каком она у вас есть, вы эффективно защищаете себя от этого.
Благодаря комментарию @DanGuzman , который указывает, что SQL-инъекция действительно возможна с помощью хранимой процедуры, если вы неправильно ее называете ...
var sql = "EXEC MySproc '" + txtInput.Text + "'";
var cmd = new SqlCommand(sql);
...
Правильный способ сделать это - убедиться, что вы используетепараметризованная команда, такая как ...
var cmd = new SqlCommand("MySproc", conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@MyParam", SqlDbType.NVarChar, 200));
cmd.Parameters["@MyParam"].Value = txtInput.Text;
...
В ответ на комментарий ОП (который, я считаю, находится в пределах исходного вопроса) ...
Также возможно стать жертвой SQL-инъекции за счет использования динамического SQL в хранимой процедуре.Например ...
CREATE PROCEDURE [dbo].[MySproc]
@MyParam NVARCHAR(200),
@MyParam2 INT
AS
BEGIN
DECLARE @SQL NVARCHAR(1000)
SET @SQL = N'SELECT * FROM [MyTable] WHERE [MyColumn] = ''' + @MyParam + N''''
EXEC sp_executesql @SQL
END
Чтобы защитить себя, вы должны параметризовать каждую передаваемую переменную в sp_executesql
...
DECLARE @SQL NVARCHAR(1000)
SET @SQL = N'SELECT * FROM [MyTable] WHERE [MyColumn] = @MyParamInner'
EXEC sp_executesql @SQL, N'@MyParamInner NVARCHAR(200)', @MyParam
Обратите внимание, выНЕ следует заключать @MyParamInner
в кавычки в предложении where, даже если это символьная переменная
Если вам нужно передать несколько значений, вы обновите его до чего-то вроде ...
DECLARE @SQL NVARCHAR(1000)
SET @SQL = N'SELECT * FROM [MyTable] WHERE [MyColumn] = @MyParamInner AND [MyColumn2] = @MyParam2Inner'
EXEC sp_executesql @SQL, N'@MyParamInner NVARCHAR(200), @MyParam2Inner INT', @MyParam, @MyParam2