【问题标题】:SQL injection-proofing TextBoxesSQL 注入验证文本框
【发布时间】:2012-04-06 11:22:20
【问题描述】:

我已经找到了一些关于这方面的教程,但它们并不是我想要的,我可以将以下内容用于用户名字段和密码字段

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

所以我需要使用参数化查询而不是我现在的方式来运行它?

【问题讨论】:

标签: sql vb.net sql-injection


【解决方案1】:

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

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

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

【讨论】:

  • 我同意,很难预测某人可以将 SQL 注入打开的文本字段的所有可能方式。最好使用参数化查询并让 SQL 防止注入...
  • 感谢您的回答,因为我对 VB.Net 和 SQL 还是很陌生,所以没有我想要的那么直接。我将通过谷歌查看您的建议,并希望可以使用它。也许您可以发布指向 MSDN 文章或教程的链接来帮助指导我?
  • @BrentHacker:这个不错:asp.net/web-forms/tutorials/data-access/…
  • 谢谢,我已经更新了我的问题
  • TBH 到目前为止,我所看到的指南仍然让我望而却步,但这只是由于我的知识水平和指南中缺乏扎实的例子,这对你没有错,所以我'我会接受你的回答哈哈!
【解决方案2】:

使用这样的参数化查询:

Using conn = New SqlConnection("some connection string")
    Using cmd = New SqlCommand("SELECT Password FROM tblUser WHERE UserName = @Name", conn)
        cmd.Parameters.Add(New SqlParameter("Name", UsernameTextBox.Text))
        conn.Open()
        Dim password As String = DirectCast(cmd.ExecuteScalar(), String)
        Console.WriteLine(password)
    End Using
End Using

这是注射安全的!

【讨论】:

    【解决方案3】:

    它不依赖于文本框。不要像这样编写连接字符串的 sql 语句:

    "SELECT * FROM User WHERE UserName=" + tbName.Text + ...
    

    使用存储过程或参数化查询,您将不会受到 SQL 注入的影响。

    当你使用参数时,文本框内容被用作一个值,所以它包含什么并不重要。

    【讨论】:

      猜你喜欢
      • 2019-06-24
      • 1970-01-01
      • 2022-06-24
      • 2015-11-09
      • 1970-01-01
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多