2

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

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

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

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

4

1 回答 1

2

由于您使用的是 Fluent,因此会自动阻止 SQL 注入,一切顺利!

而不是简单地构造这样的查询:

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

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

SELECT * FROM machines WHERE name = ?

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

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

.filter(\.$name ~~ term)

如果你宁愿让它保持现在的样子,那也没关系。

于 2020-09-01T13:19:26.820 回答