SQL-инъекция

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

context.Posts.FromSql($@" 
    SELECT * 
    FROM Posts 
    WHERE Title= {title}");

Только представьте, если бы переменная title имела значение ''; DROP TABLE Posts; --. Это приведет к удалению таблицы Customers из базы данных, поэтому мы избегаем этого, параметризуя наши запросы.

Строчная интерполяция

Интерполяция строк была введена в C # 6.0 и предлагает более удобочитаемый и выразительный способ форматирования строк. По большей части он занимает место string.Format, но компилятор также может превратить интерполированный строковый литерал в FormattableString, если вы его попросите.

В Entity Framework Core 1.x приведенный выше код будет уязвим для внедрения SQL. Однако одной из новых функций Entity Framework Core 2.0 является поддержка строковой интерполяции в необработанных методах SQL.

Эта новая функция предоставляет перегрузки для необработанных методов SQL, которые принимают FormattableString. Тип FormattableString предоставляет строку формата и переданные ей аргументы. На основе этой информации EF теперь может построить параметризованную версию запроса, используя интерполированный строковый литерал.

Делаем наши собственные

Ниже приведен пример того, как вы можете реализовать эту функцию с помощью обычного ADO.

Тогда мы сможем написать такой код.

connection.CreateCommand($@" 
    SELECT * 
    FROM Employees 
    WHERE FirstName = {firstName} AND LastName = {lastName}");

Параметр будет создан для каждого из FormattableString аргументов, а имена параметров будут переданы в строку формата, в результате чего будет получен следующий запрос.

SELECT * FROM Employees WHERE FirstName = @p0 AND LastName = @p1

Другие мысли

В репозитории Dapper уже была создана проблема с запросом аналогичной функции. Однако есть опасения по поводу рисков, связанных с его внедрением и использованием.

Тем не менее, концепция по-прежнему действительно изящная, и могут быть другие способы использовать преимущества типа FormattableString для областей, отличных от доступа к данным (например, ведения журнала).