Правильное связывание переменных и избегание внедрения SQL с запросами SQLite.swift
Документация по SQLite.swift для отфильтрованных запросов дает следующий пример:
users.filter(email.like("%@mac.com"))
// SELECT * FROM "users" WHERE ("email" LIKE '%@mac.com')
Так как я хочу искать в базе данных на основе пользовательского ввода, я думаю, я мог бы сделать следующее:
let stringPrefix = userInput + "%"
users.filter(email.like(stringPrefix))
// SELECT * FROM "users" WHERE ("email" LIKE 'johndoe%')
Я иду об этом правильным путем? В прошлом с другими средами SQLite я использовал связывание переменных с ?
чтобы избежать инъекции SQL. Это сделано за кулисами с SQLite.swift? Я не видел никакой информации в документации, за исключением небольшого количества связывания в разделе " Выполнение произвольного SQL ".
1 ответ
Взято из этого исходного файла:
@warn_unused_result public func like(pattern: String, escape character: Character? = nil) -> Expression<Bool> {
guard let character = character else {
return "LIKE".infix(self, pattern)
}
return Expression("(\(template) LIKE ? ESCAPE ?)", bindings + [pattern, String(character)])
}
Это только одна из перегрузок подобной функции. Другая перегрузка выглядит очень похоже и действительно также использует привязку параметров. Прогуляйтесь по исходному коду, чтобы убедиться в этом сами.
Однако я ожидаю, что вы проведете внутренние тесты, чтобы убедиться, что инъекции SQLite невозможны.