【发布时间】:2018-11-28 17:01:41
【问题描述】:
我正在尝试制作登录表单。
我在我的服务器上创建了一个数据库并创建了行用户名和密码。 然后我创建了一个 root 用户,密码为 root。
但是我在检查用户名和密码是否正确时遇到了问题, 我不知道如何给他 2 行。
Dim conn = New SqlConnection("Data Source=SRV-SQL;Initial Catalog=prova;User ID=user;Password=user")
Dim sda = New SqlDataAdapter("select count(*) from tblLogin where username ='" + txtUsername.Text + "' and password='" + txtUserPwd.Text + "'", conn)
Dim dt = New DataTable()
sda.Fill(dt)
If (dt.Rows().ToString() = "1") Then
MsgBox("Logged-in successfully")
Else
MessageBox.Show("The username or the password is wrong!", "Warning!", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
表格:
【问题讨论】:
-
哇!!!你那里有很多问题。首先
"username ='" + txtUsername.Text + "'"。这不是参数化查询,考虑到您正在运行的语句,txtUsername的值来自用户输入。这是宽可以注入的。你现在需要解决这个问题。 参数化您的查询。接下来我们有"password='" + txtUserPwd.Text + "'";这 非常强烈 意味着您将密码存储为纯文本。除此之外,这也对注入开放从不将密码存储为纯文本。理想情况下,它们应该经过哈希处理和加盐处理。 -
举一个非常简单的例子,如果有人输入他们的用户名
'; SELECT * FROM sys.tables; DROP TABLE tblLogin;--或' CREATE LOGIN SuperAdmin WITH PASSWORD= '123', CHECK_POLICY=OFF, CHECK_EXPIRY = OFF; ALTER SERVER ROLE [sysadmin] ADD MEMBER [SuperAdmin];--,你认为会发生什么? -
这只是一个我正在制作的有趣的项目,所以我不会在任何地方上传它,它甚至是我的第一个 SQL 项目
-
If (dt.Rows().ToString() = "1"并不表示使用您正在使用的查询成功登录。该行的值可以是 1 或 0。在任何一种情况下,您总是会得到一行。您需要查看返回的实际值,而不仅仅是行数。如果您想通过简单的行数进行检查,那么您需要SELECT * FROM tblLogin WHERE username=...。或者更好,SELECT 1 FROM tblLogin WHERE username=...。 -
@squillman 我看不出 OP Select 语句有什么问题(除了它需要使用参数)。选择 * 会减少不必要的数据。
标签: sql-server database vb.net login