如何在 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)
如果您希望保持现在的样子,那也没关系。
我目前正在实施一个 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)
如果您希望保持现在的样子,那也没关系。