2

过滤查询的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 在幕后完成的吗?除了Executing Arbitrary SQL部分中的一些关于绑定的信息外,我没有在文档中看到任何信息。

4

1 回答 1

2

取自源文件:

@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)])
}

这只是 like 函数的重载之一。另一个重载看起来非常相似,并且确实也使用了参数绑定。浏览源代码以自己验证这一点。

但是,我希望您进行内部测试以验证 SQLite 注入是不可能的。

于 2016-04-29T02:22:15.773 回答