【问题标题】:How to apply a function on a value of a where clause using Knex?如何使用 Knex 对 where 子句的值应用函数?
【发布时间】:2020-02-24 00:34:32
【问题描述】:

基本上,我想知道如何使用 Knex 生成此查询:

SELECT * FROM usr_info WHERE login = ? AND password = PASSWORD(?)

例如:

knex('usr_info')
  .where({
    'login': login,
    'password': password   // <-- specify a function to wrap the value into
  })
;

查看文档,我没有看到允许这样做的示例。这可能吗?

【问题讨论】:

    标签: mysql node.js knex.js objection.js


    【解决方案1】:

    你可能需要使用whereRaw()

    knex('usr_info')
      .whereRaw('login = ? AND password = PASSWORD(?)', [login, password]);
    

    顺便说一句,您不应该使用 MySQL 的 PASSWORD() 函数来进行您自己的应用程序身份验证。这个函数在 MySQL 8.0.11 中被移除。在 MySQL 5.7 中,它已被弃用,并且有一个注释:

    https://dev.mysql.com/doc/refman/5.7/en/encryption-functions.html#function_password

    PASSWORD() 被 MySQL Server 中的认证系统使用;您不应该在自己的应用程序中使用它。为此,请考虑使用更安全的函数,例如 SHA2()。

    此外,将明文密码传递给您的查询并不是一个好主意,因为它可能以明文形式记录在查询日志中。

    相反,我建议您在查询中仅搜索login,然后结果将包括存储在您的数据库中的散列密码。您可以在应用代码中对密码进行哈希处理,并将其与查询返回的哈希值进行比较。

    【讨论】:

    • 是的,我知道实施的安全问题。不幸的是,这是来自一个已有十多年历史的系统,一切都与此相关。最终 auth 模块将被重写,但这就是它现在的样子。
    • 叹息。我理解,但我认为这是一个更糟糕的问题,该应用程序已有十年历史,但仍然没有人愿意纠正严重的安全漏洞。但这是管理问题,而不是技术问题。
    • FWIW 问题正在得到纠正,现在只是时间问题。这样做的重点是我可以使用当前用户和数据创建一个“临时”身份验证模块。一切都过时了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多