0

我正在使用下面的 groovy 代码从 mysql db 中选择具有给定用户名和密码的行。

例如,

我正在寻找以下用户。密码作为 SHA1 哈希密码存储在 db 中。

    Name - test7
password - {SHA}01132E914B722741CC3823D0BEACB8364EEAC376

下面是尝试检索记录并失败的常规代码,因为我无法获取记录。我怀疑构造的 sql 查询是错误的。SecurityUtil 类只是解密并将明文密码作为位置参数返回给查询。我们正在使用 mysql 的 sha1 方法生成带有字符串 {SHA1} 的哈希和前缀,然后尝试检索记录。

sql.eachRow("SELECT id FROM users WHERE userName = ? AND password =CONCAT({SHA1},sha1(?))", [username, SecurityUtil.decrypt(password)]) {
authId = String.valueOf(it.id)
}
4

2 回答 2

0

如果 SQL 不想在 Groovy 中发挥作用,那就太好了。使用 GStrings,您可以获得与准备调用相同的保护,因此不会出现 SQL 注入问题,并且您可以更轻松地进行常规操作:

sql.eachRow("SELECT id FROM users WHERE userName = ${userName} and password = ${'{SHA}' + SecurityUtil.decrypt(password)}") { 
    authId = String.valueOf( it.id )
}

准备好的语句语法路径:

sql.eachRow("SELECT id FROM users WHERE userName = ? and password = ?", [username, "{SHA}${SecurityUtil.descrypt(password)}"]) {
    authId = String.valueOf( it.id )
}
于 2022-03-04T22:25:47.950 回答
-1

sql.eachRow("SELECT id FROM users WHERE userName = ? AND password =CONCAT( '{SHA1}' ,sha1(?))", [username, SecurityUtil.decrypt(password)]) { authId = String.valueOf(it 。ID) }

您可能需要将 {SHA} 放在引号中以便在 concat 运算符中使用。

于 2022-03-03T15:42:59.493 回答