首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL注入防错TextBoxes

SQL注入防错TextBoxes
EN

Stack Overflow用户
提问于 2012-03-21 21:25:36
回答 3查看 11.3K关注 0票数 3

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

代码语言:javascript
复制
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注入,因为有些电子邮件帐户中有句号或破折号?

更新:下面的是我使用的insert语句的一个示例。

代码语言:javascript
复制
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

所以我需要用参数化的查询来运行这个,而不是我现在是怎么做的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-21 21:28:15

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

要使用参数运行当前查询,非常容易:

代码语言:javascript
复制
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 (我猜到的数据库类型可能不匹配,因此您需要更改它们),然后将值设置为在查询中要使用的值。参数名以@开头。

票数 12
EN

Stack Overflow用户

发布于 2012-03-21 21:31:08

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

代码语言:javascript
复制
"SELECT * FROM User WHERE UserName=" + tbName.Text + ...

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

当您使用参数时,textbox内容被用作一个值,因此它包含什么并不重要。

票数 3
EN

Stack Overflow用户

发布于 2012-03-21 21:53:53

使用如下参数化查询:

代码语言:javascript
复制
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

这是注射安全!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9813124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档