以下代码允许用户输入用户名和密码登录以输入学生的标记。 SQL数据读取器在进行身份验证之前验证数据库中的用户凭据。如果有人可以通过腌制和散列密码来修改代码,我将不胜感激。
Dim frm As New MarksEntryFrm
Dim flag As Boolean
flag = False
If cboForm.Text = "" Or cboAcadYear.Text = "" Or cboSubjCode.Text = "" Or txtUserName.Text = "" Or txtPassword.Text = "" Then
MessageBox.Show("Please any of the fields cannot be left blank", "Blank fields", MessageBoxButtons.OK, MessageBoxIcon.Error)
Else
cmd = New SqlCommand("Select a.Form,a.AcademicYear,b.SubjectID,b.UserID,b.Password,c.Term from StudentDetails.Programmes a, StudentDetails.Subjects b,RegistrationDetails.Registration c where b.SubjectID='" & cboSubjCode.SelectedItem & "' and b.UserID='" & txtUserName.Text & "' and b.Password='" & txtPassword.Text & "' collate Latin1_General_CS_AS", cn)
cmd.Parameters.AddWithValue("@UserID", txtUserName.Text) 'protects the database from SQL Injection
cmd.Parameters.AddWithValue("@Password", txtPassword.Text) 'protects the database from SQL Injection
dr1 = cmd.ExecuteReader
ctr = ctr + 1
If dr1.Read Then
frm.Show()
ctr = 0
Hide()
ElseIf ctr < 3 Then
MessageBox.Show("Incorrect Subject Code,User Name or Password. Please try again.", "Wrong data entered", MessageBoxButtons.OK, MessageBoxIcon.Asterisk)
Else
MsgBox("Unathorized access. Aborting...")
Close()
End If
dr1.Close()
End If
End Sub
答案 0 :(得分:1)
使用参数化查询
Dim cmdText As String = _
"INSERT INTO Customer(UserName, [Password]) VALUES (@UserName,@Password)"
Dim cmd As SqlCommand = New SqlCommand(cmdText, con)
With cmd.Parameters
.Add(New SqlParameter("@UserName", txtUserName.Text))
.Add(New SqlParameter("@Password", txtPassword.Text))
End With
答案 1 :(得分:1)
P.S。 Akaglo是检查是否有空字段的更好方法是使用String.IsNullOrEmpty()方法。您的方法不会检测到任何空格或空格字符。
答案 2 :(得分:0)
在.NET成员资格提供程序中,您将获得.NET库提供的散列和种子,这应该正确实现。这个恕我直言,更喜欢滚动你自己的解决方案。有一个introduction to membership here
如果您愿意进行实施,播种和散列部分不会过于复杂。播种可以像在对其进行散列之前将随机字符串添加到原始密码一样简单。然后,将哈希和种子存储在数据库中。当用户提供密码时,您只需读取种子并比较哈希值即可。请注意,当您为加密目的制作随机字符串时,您不应该依赖Random
,而应该使用 cryptographically secure random generator。 System.Security.Cryptography
还包含许多合适的散列算法(sha1,sha256或类似算法)的实现。
再次:在我看来,你应该使用SqlMembershipProvider
寻求解决方案,以避免重新实现安全关键的东西。