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

问题描述

我目前正在实施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)

如果您希望现在就离开它,那也很好。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...