NIRMAL90 Ответов: 3

Ошибка синтаксиса в инструкции Update. Vb.net


Когда я нажимаю на кнопку Обновить, я получаю следующую синтаксическую ошибку error in update statement. vb.net

Что я уже пробовал:

If con.State = ConnectionState.Open Then
            con.Close()
        End If
        If txtID.Text = "" Then
            MsgBox("Please Select Element To Update....", MsgBoxStyle.Information)
            Exit Sub
        End If
        ''UPDATE Login SET User = 'Nirmal', Pass= 'n@12345', Rights= 'Admin' WHERE id = 2

        Try
            Dim cmditem1 As New OleDbCommand("UPDATE LOGIN set USER = ('" & txtUser.Text & "'), PASS = ('" & txtPass.Text & "'), RIGHTS = ('" & cmbRights.Text & "') where ID = " & txtID.Text, con)
            con.Open()
            cmditem1.ExecuteNonQuery()
            MsgBox("Updated Successfully", MsgBoxStyle.Information)
            con.Close()

            clean()
            setg1()
        Catch ex As Exception
            MsgBox(ex.Message)

        End Try
<connectionstrings>
    <add name="cn" connectionstring="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CONFIDENTIAL\YandexDisk\KAPYHA90\PAL\PAL_BillingDB.mdb;Jet OLEDB:Database Password=Pal@30384731;Jet OLEDB:Engine Type=5" providername="System.Data.OleDb">

3 Ответов

Рейтинг:
12

Richard Deeming

Исправление уязвимости SQL-инъекции-это самая простая часть:

Dim cmditem1 As New OleDbCommand("UPDATE LOGIN set USER = ?, PASS = ?, RIGHTS = ? WHERE ID = ?", con)

' For OLEDB, parameter names don't matter; 
' they just need to be added in the same order as they appear in the query.

cmditem1.Parameters.AddWithValue("user", txtUser.Text)
cmditem1.Parameters.AddWithValue("pass", txtPass.Text)
cmditem1.Parameters.AddWithValue("rights", cmbRights.Text)
cmditem1.Parameters.AddWithValue("ID", txtID.Text)

con.Open()
cmditem1.ExecuteNonQuery()
Теперь вам нужно будет пройти через остальную часть вашего кода и исправить любые другие запросы, которые неправильно используют параметры.


Однако вам также необходимо исправить свое хранилище паролей. В настоящее время вы храните пароли в виде обычного текста, что является крайне плохой идеей и может привести к огромным штрафам. Вместо этого вам нужно хранить соленый хэш пароля, используя уникальную соль для каждой записи и используя несколько раундов функции вывода пароля, например PBKDF2 с[^].

Безопасная Аутентификация Паролем Объясняется Просто[^]
Соленое хэширование паролей - делаем это правильно[^]


Рейтинг:
1

Patrice T

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

Цитата:
Dim cmditem1 As New OleDbCommand("UPDATE LOGIN set USER = ('" & txtUser.Text & "'), PASS = ('" & txtPass.Text & "'), RIGHTS = ('" & cmbRights.Text & "') where ID = " & txtID.Text, con)


Не обязательно решение вашего вопроса, но у вас есть еще одна проблема.
Никогда не создавайте SQL-запрос путем объединения строк. Рано или поздно вы сделаете это с помощью пользовательских вводов, и это откроет дверь к уязвимости под названием "SQL-инъекция", она опасна для вашей базы данных и подвержена ошибкам.
Одна кавычка в имени - и ваша программа выйдет из строя. Если пользователь вводит имя, например "Брайан О'Коннер", может привести к сбою вашего приложения, это уязвимость SQL-инъекции, и сбой-это наименьшая из проблем, вредоносный пользовательский ввод, и он продвигается к командам SQL со всеми учетными данными.
SQL-инъекция - Википедия[^]
SQL-инъекция[^]
Атаки SQL-инъекций на примере[^]
PHP: SQL-инъекция - руководство пользователя[^]
Шпаргалка по предотвращению инъекций SQL - OWASP[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? - Обмен Стеками Информационной Безопасности[^]


NIRMAL90

пожалуйста, помогите мне с запросом на обновление

0x01AA

На этот раз 5 за то что вы не только упомянули о sql инъекциях :)

Patrice T

Спасибо.

Рейтинг:
0

phil.o

"UPDATE LOGIN set USER = ('" & txtUser.Text & "'), PASS = ('" & txtPass.Text & "'), RIGHTS = ('" & cmbRights.Text & "') where ID = " & txtID.Text

Почему вы заключаете предоставленные значения в квадратные скобки ( и )? Синтаксис SQL неверен.
Настоящий синтаксис таков
"UPDATE LOGIN set USER = 'username', PASS = 'pass', RIGHTS = 'rights' where ID = id

НО:
Как уже было сказано в решении 1, никогда построение строк SQL путем объединения значений, полученных из пользовательского ввода. Это проблема, которую вы должны решить в первую очередь.
Кроме того, вы также не должны хранить пароли в открытом тексте.