Правильное связывание переменных и избегание внедрения 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 невозможны.

Другие вопросы по тегам