admin

SQL防注入文本框

sql

我已经找到了一些有关此的教程,但是它们并不是我想要的,我可以在用户名字段和密码字段中使用以下内容

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

因此,我需要使用参数化查询来运行它,而不是现在如何运行?


阅读 188

收藏
2021-06-07

共1个答案

admin

与其从用户输入中过滤掉“无效”数据,不如考虑使用参数化查询,而不是将用户输入直接输入到您的查询中。那是非常糟糕的形式。

要使用参数运行当前查询,非常简单:

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参数名称和正确的数据库类型(我猜想可能不匹配的数据库类型,因此您需要更改它们),然后将值设置为要在数据库中使用的值。询问。参数名称以开头@

2021-06-07