【问题标题】:Don't want select query to stop at first match [closed]不希望选择查询在第一次匹配时停止[关闭]
【发布时间】:2015-02-12 20:32:13
【问题描述】:

我在服务器中有这个选择查询:

password = "%{sql:SELECT password FROM list WHERE Account = 'their_username' AND %{sql:SELECT status FROM member WHERE login = 'their_username'"

我在“列表”表中为每个用户设置了多个密码。目前,这仅在该语句开头的密码变量与“列表”中的第一个密码匹配时才有效。

但我希望查询能够查看其他密码,并且如果任何密码与语句开头的密码变量匹配,则此操作可以正常工作。

【问题讨论】:

  • SELECT 1 FROM list WHERE Account='their_username' AND password='their_password',然后检查是否返回了一行。
  • 是 MySQL 还是 Microsoft SQL Server?您在 SQL 代码中混入了其他内容,那是什么?代码中有一个不完整和一个完整的 SQL 查询,它们应该以某种方式交互吗?
  • 请告诉我您没有以纯文本形式存储密码:(
  • 感谢大家这么快的回复!我会看看这些然后回来。

标签: mysql sql sql-server select


【解决方案1】:

第一个问题:您想从数据库中提取的最终变量是什么?是用户的状态吗?

第二个问题:您是在尝试操纵用户的密码集,还是只是在尝试确定给定的密码是否与与用户关联的任何密码匹配(而不是仅第一个)?

再次查看您的查询并问自己:我要测试的第二列的名称是什么?

我在您的查询中看到的是

SELECT password FROM list 
    WHERE Account = 'their_username' 
        AND (something missing) = 
            SELECT status FROM member WHERE login = 'their_username'

实际上,我认为应该设置您的表,以便您的查询看起来更像这样

SELECT password FROM list,member 
    WHERE member.login = 'loginName' AND list.MemberID = member.ID

玩转这个SQL fiddle,并查看relational algebra 上的一些材料

【讨论】:

  • 第一个问题:尝试查看语句开头的密码变量是否与任何一个密码匹配。第二个问题:尝试确定给定的密码是否与用户关联的任何一个密码匹配(而不是第一个)
  • 我不小心遗漏了一些查询。为了简化,我认为我们可以只关注查询的第一部分: SELECT password FROM list WHERE Account = 'their_username'
  • 我不能在语句开头将密码变量插入到 Select 查询中,就像其他人在这里提到的密码 = 'their_password'
【解决方案2】:

我不敢相信我正在帮助解决这个问题,有如此明显和严重的安全问题,但你应该在两个表上做一个 JOIN:

SELECT l.password 
FROM member m
INNER JOIN list l ON l.login = m.Account
WHERE m.Account = 'their_username' and l.password='the_password'

然后你应该回去学习如何正确处理密码:加盐和散列密码意味着什么。更好的是:永远不要编写自己的身份验证代码。相反,尽可能多地依赖您选择的平台提供给您的身份验证功能,因为编写似乎有效的身份验证代码非常容易,通过了全面的单元测试,并且仍然存在缺陷,因此您的应用程序很难破解.

【讨论】:

  • 这不适用于典型的密码方案。它用于服务器实现,不适用于常规用户身份验证。无论如何,用'the_password'来做你所说的事情。我无法将该变量放入语句/查询中。
  • 然后您返回一个包含所有可能结果的查询,并在客户端上对其进行迭代。
【解决方案3】:

这应该返回所有密码!可能您的表中只有一种用户名状态组合。

username   status    password
abc123     online    pppp
abc123     online    qqqq
def456     online    rrrr
def456     offline   ssss

如果用户名是 abc123,它将只返回一个密码,但对于 def456,它将返回两个! 您能否发布您的列表以加深理解!

【讨论】:

  • 我会尽可能发布表格列表。我的情况就像你的 abc123 例子。我正在尝试确定给定的密码是否与与用户关联的任何一个密码匹配(而不是第一个)。但我试图做到这一点,但无法直接比较 SQL 查询中的给定/可变密码。不知道这是否有意义大声笑或如何描述它
猜你喜欢
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2022-12-03
相关资源
最近更新 更多