vb.net - 输入正确的用户名和密码后登录无效
问题描述
Try
Dim connString As String = ConfigurationManager.ConnectionStrings("dbx").ConnectionString
Dim cmdString As String = "SELECT * FROM Users WHERE UserName = @UserName AND Password = @Password"
Using conn As New OleDbConnection(connString)
Using cmd As New OleDbCommand(cmdString, conn)
conn.Open()
cmd.Parameters.AddWithValue("@UserName", TextBox1.Text)
cmd.Parameters.AddWithValue("@Password", TextBox2.Text)
Dim reader As OleDbDataReader = cmd.ExecuteReader
dtRowsReturned.Load(reader)
End Using
End Using
If dtRowsReturned.Rows.Count > 0 Then
Me.Hide()
Dim dss As New Form1()
dss.ShowDialog()
Else
MessageBox.Show("Account/Password is incorrect Please try again", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
Catch ex As ApplicationException
MessageBox.Show("Error: " & ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
TextBox1.Clear()
TextBox2.Clear()
TextBox1.Focus()
End Try
End Sub
Private Function IsValidated() As Boolean
If TextBox1.Text.Trim = String.Empty Then
MessageBox.Show("Account Required.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
TextBox1.Focus()
Return False
End If
If TextBox2.Text.Trim = String.Empty Then
MessageBox.Show("Passwrd Requried.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
TextBox2.Focus()
End If
Return False
End Function
解决方案
我们看不到第一种方法的开始,但根据我们所看到的,我猜它会IsValidated()
在继续之前检查函数。无处IsValidated()
返回True
,因此第一种方法的其余部分甚至永远不会尝试运行密码检查。IsValidated()
应该看起来更像这样:
Private Function IsValidated() As Boolean
If String.IsNullOrWhiteSpace(TextBox1.Text) Then
MessageBox.Show("Account Required.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
TextBox1.Focus()
Return False
End If
If String.IsNullOrWhiteSpace(TextBox2.Text) Then
MessageBox.Show("Passwrd Requried.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
TextBox2.Focus()
Return False
End If
Return True
End Function
当我在这里时,将密码直接存储在数据库列中是绝对不行的。您需要为每个用户添加一个盐值列。当用户设置新密码时,您将盐值预先附加到密码中,然后针对结果运行加密哈希(如BCrypt)。然后您可以将该哈希值存储在数据库中。当有人尝试登录时,您将盐添加到他们尝试的密码中,运行相同的加密哈希算法,并将结果与存储在数据库中的哈希值进行比较。任何更少的东西都是不安全和业余的。
而这仅仅是开始。还需要考虑内存安全(即:)SecureString
、传输安全、重置过程等。简而言之,您不想自己编写此代码,或者以任何方式参与构建您自己的身份验证系统。很容易得到看似正确的结果——甚至通过了严格的单元测试,但在微妙的方面是错误的,以至于一年后你发现你在六个月前被黑客入侵了。相反,请尽可能依赖您选择的平台已经提供的身份验证工具。
推荐阅读
- rust - 如何调试 proc 宏?
- android - 由 java.lang.IllegalStateException 引起的 EmojiCompat 未初始化,库 androidx.emoji.widget.EmojiTextView
- java - 使用映射计算小写单词中字母出现次数的静态方法
- neo4j - 根据两个不同节点之间的关系查询节点
- powershell - 在 powershell 中更改 csv 文件并导出为 JSON
- sql - 如何解决没有找到数据的plsql中的错误
- regex - htaccess 通过子域访问文件夹
- pyephem - PyEphem 和 Skyfield 之间的方位角/高度差异
- c# - 创建类对象的集合
- javascript - 如何使用 React 在函数中调用 usehook?