SQL-инъекция TextBoxes - PullRequest
       4

SQL-инъекция TextBoxes

2 голосов
/ 22 марта 2012

Я уже нашел некоторые учебники по этому вопросу, но они не совсем то, что я ищу, я могу использовать следующее для полей имени пользователя и поля пароля

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

Так что мне нужно запускать это с параметризованными запросами, а не как я это делаю сейчас?

Ответы [ 3 ]

11 голосов
/ 22 марта 2012

Вместо того, чтобы отфильтровывать «недействительные» данные из пользовательского ввода, рассмотрите возможность использования параметризованных запросов и не помещайте пользовательский ввод непосредственно в ваши запросы; это очень плохая форма.

Чтобы выполнить текущий запрос с использованием параметров, это довольно просто:

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 с именем параметра и правильным типом базы данных (те, которые я угадал, вероятно, не совпадают, поэтому вы захотите изменить их), затем установите значение на значение, которое вы хотите использовать в запросе. Имена параметров начинаются с @.

3 голосов
/ 22 марта 2012

Это не зависит от текстового поля.Не составляйте SQL-предложение, объединяющее строки, подобные этому:

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

Используйте хранимые процедуры или параметризованные запросы, и вы будете защищены от внедрения SQL.

При использовании параметров текстовое полеконтент используется как значение, поэтому не имеет значения, что он содержит.

0 голосов
/ 22 марта 2012

Используйте параметризованный запрос следующим образом:

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

Это безопасно для инъекций!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...