如何在 Vapor 4 (Fluent 4) 中防止 SQL 用户搜索词注入

How to prevent SQL Injections with User-Search-Terms in Vapor 4 (Fluent 4)

我目前正在实施一个 Vapor 4 应用程序,它将用于管理机器。 用户应该能够搜索 机器名称,这是我通过

完成的
.filter(Machine.path(for: \Machine.$name), .contains(inverse: false, .anywhere), term)

其中 term 是用户提供的任意 String。 代码本身按预期工作,但我想知道是否存在 SQL 注入漏洞(或其他攻击)的可能性。

我的问题:
SQL 注入(或其他攻击)是否可能?如果可能,我该如何预防(请提供代码示例)?

由于您使用的是 Fluent,SQL 自动阻止注入,您可以开始了!

而不是像这样简单地构建查询:

SELECT * FROM machines WHERE name = '\(user_provided_name)'

Fluent 使用值绑定,这是数据库提供的一项功能,用于将值传递到查询中,以便在字符串包含 SQL 代码时转义值,不会执行该值。它看起来像这样:

SELECT * FROM machines WHERE name = ?

然后将值与查询一起传递到数据库服务器(在本例中为MySQL),它会自动将占位符(?)替换为提供的值。

快速评论您的查询,如果需要,您可以导入 FluentSQL 模块,然后像这样编写您的查询:

.filter(\.$name ~~ term)

如果您希望保持现在的样子,那也没关系。