Учет регистра в запросе пароля SQL с помощью COLLATE

#sql #vb.net #visual-studio-2013 #case-sensitive #collate

#sql #vb.net #visual-studio-2013 #с учетом регистра #сопоставить

Вопрос:

Я использую следующий код SQL в моем VB в VS2013. Я хочу создать форму входа в систему, используя базу данных пользователей, сохраненную в списке пользователей. Однако запрос не чувствителен к регистру. Как мне изменить строку запроса, чтобы использовать СОПОСТАВЛЕНИЕ или любое другое сравнение с учетом регистра

 Dim Check As String = _
   "SELECT COUNT(*) AS Expr1 FROM UserList HAVING (Username = '" amp; _
    _UsernameTextBox.Text amp; "') AND ([Password]= '" amp; _PasswordTextBox.Text amp; _
    "') AND (UserType = '" amp; User.ToString amp; "')"

    With search
        .CommandText = Check
        .Connection = cn
        If .ExecuteScalar() = 1 Then
            Me.Hide()
            If User = "Trader" Then

                Trader.Show()
            ElseIf User = "Broker" Then
                Broker.Show()
            ElseIf User = "Corporate" Then
                Corporate.Show()
            ElseIf User = "System" Then
                SystemManager.Show()


            End If
        Else : MsgBox("IncorrectInput")
        End If`
 

Комментарии:

1. Вы никогда не должны хранить пароль без хэша. Сохраните пароль в виде соленого хэша (например, PBKDF2), и ваша проблема не возникнет.

2. Я предлагаю вам провести некоторое исследование, есть много веб-сайтов, объясняющих PBKDF2 для .NET.

Ответ №1:

    "SELECT COUNT(*) AS Expr1 FROM UserList 
HAVING (Username = @username)  
AND ([Password] COLLATE Latin1_General_CS_AS = @password) 
AND (UserType = @usertype)

"
 

Помимо того факта, что ваш пароль не сохранен и не сравнивается с криптографической хэш-функцией с медленным шифрованием (= необратимое шифрование), ваш запрос также уязвим для SQL-инъекции (когда я использую имя пользователя типа «Жан ле Ронд д’Аламбер» или просто «д’Аламбер».

Другая ошибка заключается в том, что когда вы сохраняете пароль в виде обычного текста, скажем, например (n) varchar(32), я могу ввести пароль, который длиннее этого (например, предложение) ==> ошибка

Учитывая, что вы пишете финансовое приложение («брокер», «корпоративный»), внедрение SQL представляет собой недопустимую угрозу безопасности.

Вы можете, например, MD5-хэшировать свой пароль (дешевый и грязный): master.dbo.fn_varbintohexstr(HashBytes(‘MD5’, ‘test’))

У вас есть «System.Data.SqlClient.SqlCommand», туда вы можете добавить System.Data.SqlClient.SqlCommand

 using (SqlConnection connection = new SqlConnection(connectionString))
    {
        connection.Open();
        //
        // Description of SQL command:
        // 1. It selects all cells from rows matching the name.
        // 2. It uses LIKE operator because Name is a Text field.
        // 3. @Name must be added as a new SqlParameter.
        //
        using (SqlCommand command = new SqlCommand(
        "SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
        {
        //
        // Add new SqlParameter to the command.
        //
        command.Parameters.Add(new SqlParameter("Name", dogName));
        //
        // Read in the SELECT results.
        //
        SqlDataReader reader = command.ExecuteReader();
        while (reader.Read())
        {
            int weight = reader.GetInt32(0);
            string name = reader.GetString(1);
            string breed = reader.GetString(2);
            Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}",
            weight,
            name,
            breed);
        }
        }
    }
 

Если вы сделаете это правильно с самого начала, вам не придется ничего менять позже.

Комментарии:

1. Но как тогда мне указать, откуда получать параметры запроса?

2. безопасность для меня пока не проблема, потому что это всего лишь игра, которую я создаю. Как только он заработает, безопасность станет моим следующим приоритетом

3. @Frankenstein: расширенный ответ.

4. Есть ли способ изменить мой существующий код или просто применить свойство collate ко всей таблице?

5. @Frankenstein: ВЫБЕРИТЕ * ИЗ ТАБЛИЦЫ, ГДЕ (условие) группировать по xy упорядочивать по abc СОПОСТАВЛЯТЬ Latin1_General_CS_AS