#sql #безопасность
Одним из способов предотвращения SQL-инъекций считается применение параметризованных запросов, вместо прямой подстановки пользовательских данных в запрос, например: private static void UpdateDemographics(Int32 customerID, string demoXml, string connectionString) { // Update the demographics for a store, which is stored // in an xml column. string commandText = "UPDATE Sales.Store SET Demographics = @demographics " + "WHERE CustomerID = @ID;"; using (SqlConnection connection = new SqlConnection(connectionString)) { SqlCommand command = new SqlCommand(commandText, connection); command.Parameters.Add("@ID", SqlDbType.Int); command.Parameters["@ID"].Value = customerID; // Use AddWithValue to assign Demographics. // SQL Server will implicitly convert strings into XML. command.Parameters.AddWithValue("@demographics", demoXml); try { connection.Open(); Int32 rowsAffected = command.ExecuteNonQuery(); Console.WriteLine("RowsAffected: {0}", rowsAffected); } catch (Exception ex) { Console.WriteLine(ex.Message); } } } То есть имеется некий запрос, в который мы передаём полученные впоследствии от пользователя параметры. Но чем такой способ отличается от непосредственной подстановки в запрос параметров пользователя? Ведь мы по-прежнему можем поместить код-инъекцию в @ID, передав таким образом запрос на выполнение. В чем принципиальное преимущество?
Ответы
Ответ 1
Если выполняется честный prepare, то текст запроса передаётся отдельно, а данные для него - отдельно, по специальному протоколу ("привет, выполни тот запрос, первый параметр для него - это следующие 8 байт, а второй - следующие 20"). Данные в запрос никогда не подставляются и сервер в принципе не может перепутать данные и запрос. Если выполняется эмуляция подготовленного запроса - то код библиотеки, выполняющей запрос, берёт на себя ответственность за корректное экранирование всех подставляемых данных. Выполняется честный prepare или его эмуляция - надо выяснять для конкретной библиотеки (возможно, это отдельная настройка конфигурации библиотеки). Но если используется что-то общеизвестное, стандартное и актуальной версии - то оба варианта достаточно безопасны.
Комментариев нет:
Отправить комментарий