Member 14693349 Ответов: 3

Reader=cmd.excutereader говорит system.data.sqlclient.sqlexception: 'недопустимое имя столбца 'username'.


Imports System.DateTime
Imports System.Data.SqlClient
Public Class Form1

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Application.Exit()

    End Sub

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        If txtUserName.Text = "" Or txtPassword.Text = "" Then
            MessageBox.Show("UserId and Password is Required")

        Else
            conn = New SqlConnection("Data Source=DESKTOP-BSS9JRL;Initial Catalog=firstProject2;Integrated Security=True")
            conn.Open()
            query = "select UserName, password from tbl_login where UserName= '" & txtUserName.Text & "' and Password= '" & txtPassword.Text & "'"
            cmd = New SqlCommand(query, conn)
            reader = cmd.ExecuteReader
            If reader.Read = True Then
                User = txtUserName.Text
                Me.Hide()
                Dashboard.Show()


            Else
                MsgBox("Invalid UserName/Password", MsgBoxStyle.Critical)

            End If
            conn.Close()



        End If



    End Sub
End Class


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

Черт Возьми Сэр,

Я попытался создать форму входа в окно в visual basic. Но есть в кодировании я получаю ошибку в reader=cmd.ExcuteReader
System.Data.SqlClient.SqlException: 'Invalid column name 'UserName'.


Пожалуйста, любезно помогите, как только сможете.

Спасибо.

F-ES Sitecore

Попробуйте заключить имя пользователя и пароль в квадратные скобки.

выберите [имя пользователя] ....

Кроме того, Google, как использовать параметризованные запросы, ваш код уязвим для всех видов взлома.

Richard MacCutchan

Как пишется "имя пользователя" в таблице базы данных?

3 Ответов

Рейтинг:
25

OriginalGriff

Такой короткий код, столько плохих идей ...

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

Когда вы объединяете строки, вы вызываете проблемы, потому что SQL получает такие команды, как:

SELECT * FROM MyTable WHERE StreetAddress = 'Baker's Wood'
Цитата, добавленная пользователем, завершает строку в том, что касается SQL, и вы получаете проблемы. Но могло быть и хуже. Если я приду и наберу вместо этого: "x';DROP TABLE MyTable;--", то SQL получит совсем другую команду:
SELECT * FROM MyTable WHERE StreetAddress = 'x';DROP TABLE MyTable;--'
Которые SQL видит как три отдельные команды:
SELECT * FROM MyTable WHERE StreetAddress = 'x';
Совершенно правильный выбор
DROP TABLE MyTable;
Вполне допустимая команда "удалить таблицу"
--'
А все остальное-это комментарии.
Так оно и происходит: выбирает любые совпадающие строки, удаляет таблицу из базы данных и игнорирует все остальное.

Поэтому всегда используйте параметризованные запросы! Или будьте готовы часто восстанавливать свою БД из резервной копии. Вы ведь регулярно делаете резервные копии, не так ли?

А SQL-инъекция в логин? Это просто означает, что мне даже не нужно регистрироваться, чтобы выдать себя за вас или уничтожить вашу базу данных ...

2) Никогда не храните пароли в открытом тексте - это серьезная угроза безопасности. Здесь есть некоторая информация о том, как это сделать: Хранение паролей: как это сделать.[^] - код написан на C#, но это довольно очевидно.

И помните: если это веб-сайт и у вас есть какие-либо пользователи из Европейского союза, то применяется GDPR, а это означает, что вы должны обрабатывать пароли как конфиденциальные данные и хранить их безопасным и безопасным способом. Текст-это ни то, ни другое, и штрафы могут быть ... ГМ ... выдающийся. В декабре 2018 года немецкая компания получила относительно низкий штраф в размере 20 000 евро именно за это.

3) Почему вы выбираете имя пользователя и пароль из таблицы, передавая ей имя пользователя и пароль, которые вы используете в своем состоянии WHERE? Конечно, то, что вы хотите вернуть, - это UserID, так как вы уже знаете два других элемента?

А теперь тот, кого вы заметили ...
Посмотрите на ваше сообщение об ошибке:
Invalid column name 'UserName'
Это так ясно, как только может быть.
Ваша таблица БД не содержит столбца под названием "Имя пользователя" - либо вы написали его неправильно, либо вы пытаетесь использовать неправильную таблицу / базу данных.


Рейтинг:
0

Maciej Los

В дополнение к решению №1 от OriginalGriff, я бы предложил использовать Оператор using[^] всякий раз, когда вам приходится иметь дело с одноразовыми предметами.

Dim query As String = "select [UserName] from tbl_login where [UserName]= @username and Password= @pwd"
	
Using conn As SqlConnection = New SqlConnection("Data Source=DESKTOP-BSS9JRL;Initial Catalog=firstProject2;Integrated Security=True")
	conn.Open()
	Using cmd As SqlCommand = New SqlCommand(query, conn)
		cmd.CommandType = CommandType.Text
		cmd.Parameters.AddWithValue("@username", txtUserName.Text)
		cmd.Parameters.AddWithValue("@pwd", txtPassword.Text)
		Using reader As SqlDataReader = cmd.ExecuteReader()
			If reader.HasRows() Then
				'success!
				While reader.Read()
					'you can read returned value
				End While
			End If
		End Using 
	End Using
End Using


Для получения более подробной информации, пожалуйста, смотрите:
Коллекции sqlparametercollection.Метод AddWithValue(String, Object) (System.Data.SqlClient) | Microsoft Docs[^]


Совет: вы должны сохранить строку подключения во внешнем файле, так как она может измениться в процессе развертывания. Видеть: Строки подключения и файлы конфигурации | Microsoft Docs[^]


Рейтинг:
0

Patrice T

query = "select UserName, password from tbl_login where UserName= '" & txtUserName.Text & "' and Password= '" & txtPassword.Text & "'"

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