1

VS2013 の VB で次の SQL コードを使用しています。UserList に格納されているユーザーのデータベースを使用してログイン フォームを作成したいと考えています。ただし、クエリは大文字と小文字を区別しません。COLLATE またはその他の大文字と小文字を区別する比較を使用するようにクエリ文字列を変更するにはどうすればよいですか

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

    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`
4

1 に答える 1

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

"

パスワードが保存されておらず、低速のソルト暗号化ハッシュ関数 (= 非可逆暗号化) と比較されていないという事実とは別に、クエリは SQL インジェクションに対しても脆弱です (「Jean le Rond のようなユーザー名を使用すると、ダランベール」または単に「ダランベール」。

もう 1 つのバグは、パスワードをプレーン テキスト (たとえば (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);
        }
        }
    }

最初から正しく行えば、後で何も変更する必要はありません。

于 2014-06-27T06:49:12.773 に答える