【问题标题】:How to prevent SQL Injections with User-Search-Terms in Vapor 4 (Fluent 4)如何在 Vapor 4 (Fluent 4) 中使用 User-Search-Terms 防止 SQL 注入
【发布时间】:2020-12-17 09:47:30
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: swift sql-injection vapor vapor-fluent


    【解决方案1】:

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

    而不是像这样简单地构造一个查询:

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

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

    SELECT * FROM machines WHERE name = ?
    

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

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

    .filter(\.$name ~~ term)
    

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

    【讨论】:

    • 感谢您的回答和解释! 请确定:同时我将过滤器语句更改为 .filter(\Machine.$name, .custom ("ilike"), "%(term)%"),忽略大小写。我假设 .custom(...) 过滤器也使用值绑定处理用户输入,尽管它是一个自定义语句。您也可以确认一下吗?
    • @sw1ft3r 是的,那个使用还会绑定值并防止 SQL 注入攻击。
    猜你喜欢
    • 2014-07-06
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 2019-12-03
    相关资源
    最近更新 更多