这个SQL代码是否应该让我们使用“用户名”和“密码”登录?

时间:2012-04-20 16:10:26

标签: vb.net sqlite legacy

我们正在尝试调试一些遗留代码。我们发现我们可以使用所有用户的密码“password”登录系统。我们还可以使用用户名“username”和密码“password”登录,也可以使用用户名“username”和系统中某个用户的密码登录。

这使我们认为SQL查询可能存在问题,该问题可能与登录表单中的用户名字段匹配“username”或STRING“username”列。 (与密码相同)。

然而,不幸的是,我们不是VB.net的人,无论我们做什么,这种行为似乎都是一样的。这是原始代码:

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE username = """ & username & """ AND password = """ & password & """"
SQLreader = SQLcommand.ExecuteReader()

(我们不确定所有"""的内容是什么)

因此,使用我们对编程和SQL的了解,我们做到了这一点:

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE `username` = """ & username & """ AND `password` = """ & password & """"
SQLreader = SQLcommand.ExecuteReader()

同样没有效果:

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE tblUsers.username = """ & username & """ AND tblUsers.password = """ & password & """"
SQLreader = SQLcommand.ExecuteReader()

这也没有效果。

所以问题是这是SQL代码的问题吗?或者我们在错误的地方寻找?我认为我们不是在寻找错误的地方。虽然我们不是VB.net的人,但我们仍然非常精通编程。同时输出(跟踪)SQLreader(0)会为查询返回1,其中“username”和“password”作为用户名和密码,这意味着它匹配某些东西。

任何帮助都会很棒。我们有什么东西可以忽略吗?

由于

(免责声明:此代码不会在生产环境中的任何地方使用。您现在都可以放松了!)

1 个答案:

答案 0 :(得分:2)

如果我正确读到这个,你在这里遇到了一些问题。

假设您在此处连接到Microsoft SQL Server(因为您正在使用SQLCommand),您将在用户名和密码变量周围加上双引号,从而表示您正在将列用户名与列进行比较(变量中的任何内容)。假设用户名有“john”,密码中有“1234”。你的sql语句如下所示:

SELECT level FROM tblUsers WHERE username = "john" and password = "1234"

Double Quotes意味着无论文本中是否有列的名称,因此SQL正在查找名为john和1234的列。您应该使用单引号/撇号。

SELECT level FROM tblUsers WHERE username = 'john' and password = '1234'

如果您使用的是用户名“username”和密码“password”,那么您实际上只是从用户表中选择了用户名栏中的级别,其中username列为username列,密码列为= password列。 (:

无论如何,除了所有这些之外,将变量直接粘贴到SQL查询中会使SQL查询处于打开状态,因此最好使用参数。

SQLcommand.CommandText = "SELECT level FROM tblUsers WHERE username = @username AND password = @password"
SQLcommand.Parameters.AddWithValue("@username",username)
SQLcommand.Parameters.AddWithValue("@password",password)
SQLreader = SQLcommand.ExecuteReader()

试一试。

相关问题