我已经找到了一些有关此的教程,但是它们并不是我想要的,我可以在用户名字段和密码字段中使用以下内容
Private Sub UsernameTextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles UsernameTextBox.KeyPress If Char.IsDigit(e.KeyChar) OrElse Char.IsControl(e.KeyChar) OrElse Char.IsLetter(e.KeyChar) Then e.Handled = False Else e.Handled = True End If End Sub
但是对于电子邮件字段,由于某些电子邮件帐户中包含句点或破折号,我将如何防止该文本框的SQL注入?
更新: 以下是我使用的插入语句的示例。
Dim con As SqlConnection con = New SqlConnection() Dim cmd As New SqlCommand Try con.ConnectionString = "Data Source=" & Server & ";Initial Catalog=" & Database & ";User ID=" & User & ";Password=" & Password & ";" con.Open() cmd.Connection = con cmd.CommandText = "INSERT INTO TB_User(STRUserID, password, Email) VALUES('" & UsernameTextBox.Text & "', '" & MD5Hash(PasswordTextBox.Text) & "', '" & EmailTextBox.Text & "')" cmd.ExecuteNonQuery() Catch ex As Exception MessageBox.Show("Error while inserting record on table..." & ex.Message, "Insert Records") Finally con.Close() End Try
因此,我需要使用参数化查询来运行它,而不是现在如何运行?
与其从用户输入中过滤掉“无效”数据,不如考虑使用参数化查询,而不是将用户输入直接输入到您的查询中。那是非常糟糕的形式。
要使用参数运行当前查询,非常简单:
Dim con As New SqlConnection() Dim cmd As New SqlCommand() Try con.ConnectionString = "Data Source=" & Server & ";Initial Catalog=" & Database & ";User ID=" & User & ";Password=" & Password & ";" con.Open() cmd.Connection = con cmd.CommandText = "INSERT INTO TB_User(STRUserID, password, Email) VALUES(@username, @password, @email)" cmd.Parameters.Add("@username", SqlDbType.VarChar, 50).Value = UsernameTextBox.Text cmd.Parameters.Add("@password", SqlDbType.Char, 32).Value = MD5Hash(PasswordTextBox.Text) cmd.Parameters.Add("@email", SqlDbType.VarChar, 50).Value = EmailTextBox.Text cmd.ExecuteNonQuery() Catch ex As Exception MessageBox.Show("Error while inserting record on table..." & ex.Message, "Insert Records") Finally con.Close() End Try
您所要做的就是使用cmd.Parameters.Add参数名称和正确的数据库类型(我猜想可能不匹配的数据库类型,因此您需要更改它们),然后将值设置为要在数据库中使用的值。询问。参数名称以开头@。
cmd.Parameters.Add
@