问题描述
我目前正在实施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)
如果您希望现在就离开它,那也很好。