Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_k_ekzamenu.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
564 Кб
Скачать
☆
  1. Выполнение параметризованных команд с использованием объекта Command. Атака внедрением.

protected void cmdGetRecords_Click(object sender, EventArgs e)

{

String connectionString = WebConfigurationManager.ConnectionStrings["Northwind"].ConnectionString;

SqlConnection con = new SqlConnection(connectionString);

// Получить заказы по идентификатору заказчика

string sql =

"SELECT Orders.CustomerID, Orders.OrderID, COUNT(UnitPrice) AS Items, " +

"SUM(UnitPrice * Quantity) AS Total FROM Orders " +

"INNER JOIN [Order Details] " +

"ON Orders.OrderID = [Order Details].OrderID " +

"WHERE Orders.CustomerID = '" + txtID.Text + "' " +

"GROUP BY Orders.OrderID, Orders.CustomerID";

SqlCommand cmd = new SqlCommand(sql, con);

con.Open();

SqlDataReader reader = cmd.ExecuteReader();

GridView1.DataSource = reader;

GridView1.DataBind();

reader.Close();

con.Close();

}

Атаки внедрением:

Вот что пользователь может ввести в текстовом поле, чтобы осуществить более изощренную атаку внедрением SQL, удалив все строки в таблице Customers: 

ALFKI‘); DELETE * FROM Customers -- -

; – граница начала нового оператора

-- - комментирует оставшуюся часть оператора.

Что бы избежать этой опасности, нужно использовать параметры.

Параметризованная команда – это просто команда, которая использует символы-заполнители в тексте SQL. Заполнитель указывает место для динамически применяемых значений, которые затем пересылаются через коллекцию Parameters объекту Command. 

Например, следующий оператор SQL: SELECT * FROM Customers WHERE CustomerID = 'ALFKI‘ должен стать чем-то вроде: SELECT * FROM Customers WHERE CustomerID = @CustID

@CustID значение будет считаться единым целым, независимо от того, что ввел пользователь.

У класса Command есть коллекция Parameters, через которую реализуется передача параметризированных команд на сервер:

SqlCommand com = new SqlCommand("Select CityName from City where CountryID = (select CountryID from Country where CountryName = @Name)", con);

com.Parameters.AddWithValue("@Name", CountryName);

Такой оператор гарантированно избежит SQL инъекции.

  1. Хранимые процедуры. Вызов хранимых процедур в ado .Net, передача параметров.

Выполнение в базе данных хранимых процедур вместо отдельных операторов SQL дает пользователю следующие преимущества:

  • необходимые операторы уже содержатся в базе данных;

  • все они прошли этап синтаксического анализа и находятся в исполняемом формате; перед выполнением хранимой процедуры SQL Server генерирует для нее план исполнения, выполняет ее оптимизацию и компиляцию;

  • хранимые процедуры поддерживают модульное программирование, так как позволяют разбивать большие задачи на самостоятельные, более мелкие и удобные в управлении части;

  • хранимые процедуры могут вызывать другие хранимые процедуры и функции;

  • хранимые процедуры могут быть вызваны из прикладных программ других типов;

  • как правило, хранимые процедуры выполняются быстрее, чем последовательность отдельных операторов;

  • хранимые процедуры проще использовать: они могут состоять из десятков и сотен команд, но для их запуска достаточно указать всего лишь имя нужной хранимой процедуры. Это позволяет уменьшить размер запроса, посылаемого от клиента на сервер, а значит, и нагрузку на сеть.

Пример:

Процедура:

CREATE PROCEDURE dbo.AddCustomer

@CityName nvarchar(255),

@CustomerName nvarchar(255)

AS

BEGIN

insert into Customer (CustomerName,CityID) values (@CustomerName,(select CityID from City where CityName = @CityName));

END

Вызов процедуры в клиентской программе:

SqlCommand com = new SqlCommand("AddCustomer", con);

com.CommandType = CommandType.StoredProcedure;

com.Parameters.AddWithValue("@CityName", “Гомель”);

com.Parameters.AddWithValue("@CustomerName", “Ковбеня Э.М.”);

try

{

con.Open();

com.ExecuteNonQuery();

}

catch (Exception e)

{}

finally

{

con.Close();

}

Некоторые процедуры могут иметь выходной (OUTPUT) параметр:

CREATE PROCEDURE InsertEmployee

@TitleOfCourtesy varchar(25),

@LastName varchar(20),

@FirstName varchar(10),

@EmployeeID int OUTPUT

AS

INSERT INTO Employees

(TitleOfCourtesy, LastName, FirstName, HireDate)

VALUES (@TitleOfCourtesy, @LastName, @FirstName, GETDATE());

SET @EmployeeID = @@IDENTITY

Прочитать выходной параметр достаточно просто:

cmd.Parameters.Add(new SqlParameter("@EmployeeID", SqlDbType.Int, 4));

cmd.Parameters["@EmployeeID"].Direction = ParameterDirection.Output;

try

{

con.Open();

cmd.ExecuteNonQuery();

int empID = (int)cmd.Parameters["@EmployeeID"].Value;

}

finally

{

con.Close();

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]