0

WebMethodユーザーがフロントエンドからログインするアプリケーションのバックエンドに 次のものを作成しました。

[WebMethod]
    public String Login(String userName, String password)
    {

            OleDbConnection connect = new OleDbConnection(connection);
            connect.Open();
            OleDbCommand command = new OleDbCommand("Select * from login where userName='" + userName + "'  and password ='" + password + "'", connect);
            command.CommandType = CommandType.Text;
            OleDbDataAdapter adapter = new OleDbDataAdapter();
            adapter.SelectCommand = command;
            DataSet NSNSet = new DataSet();
            adapter.Fill(NSNSet);

            string username = NSNSet.Tables[0].Rows[0]["firstName"].ToString() + NSNSet.Tables[0].Rows[0]["lastName"].ToString();

            int userID = System.Convert.ToInt16(NSNSet.Tables[0].Rows[0]["UID"].ToString());

            return username + "," + userID;


    }

現在、私はエラー処理を行っています -

catch(Exception ex)
            {
                string error = System.Convert.ToString(ex);
                if (error.Contains("There is no row at position 0"))
                {
                    status.Text = "Incorrect Username/Password combination";
                }
            }

これは問題なく動作しますが、より具体的なエラーを返すようにコードを変更するにはどうすればuserNameよいpasswordでしょうか。

4

4 に答える 4

3

詳細を教えないでください。簡単なログイン エラー メッセージを表示してください。ただし、ハッカーがその情報を使用できるため、ユーザー名が間違っている、またはパスワードが間違っているなどとは言わないでください。

ログインに失敗したことを示す簡単なテキストは問題ないはずです

于 2012-06-29T10:48:40.957 に答える
2

あなたはこのようにすべきです:

public String Login(String userName, String password)
    {
        OleDbConnection connect = new OleDbConnection(connection);
        connect.Open();

        OleDbCommand command = new OleDbCommand("Select UID, firstName, lastName from login where userName=?  and password =?", connect);
        command.CommandType = CommandType.Text;

        //to avoid sql injection
        command.Parameters.Add(userName);
        command.Parameters.Add(password);

        OleDbDataAdapter adapter = new OleDbDataAdapter();
        adapter.SelectCommand = command;
        DataSet NSNSet = new DataSet();
        adapter.Fill(NSNSet);

        if (NSNSet.Tables[0].Rows.Count == 0)
            return "Access denied";

        string username = NSNSet.Tables[0].Rows[0]["firstName"].ToString() + NSNSet.Tables[0].Rows[0]["lastName"].ToString();
        int userID = int.Parse(NSNSet.Tables[0].Rows[0]["UID"].ToString());
        return username + "," + userID;
    }

または、パフォーマンスのためにDataReaderを使用するより良い方法:

public String Login(String userName, String password)
    {

        OleDbConnection connect = new OleDbConnection(connection);
        connect.Open();

        OleDbCommand command = new OleDbCommand("Select UID, firstName, lastName from login where userName=?  and password =?", connect);
        command.CommandType = CommandType.Text;

        //to avoid sql injection
        command.Parameters.Add(userName);
        command.Parameters.Add(password);

        OleDbDataReader reader=command.ExecuteReader();
        if (reader.Read())
        {
            //that means there's at least one row
            string username = reader["firstName"] + " " + reader["lastName"];
            int userID = int.Parse(reader["UID"].ToString());
            return username + "," + userID;
        }
        else
        {
            //no combination username-password found
            return "Access denied";
        }
    }
于 2012-06-29T11:21:22.893 に答える
1

クエリの選択をこれに少し変更できます。

"select * from login where userName='"+userName+"'";

DataSet に行がない場合は、書き込みます

Invalid UserName

ユーザーが存在する場合は、パスワードが一致するかどうかを確認し、一致しない場合は書き込みます

Invalid Password
于 2012-06-29T10:52:43.177 に答える
1

まず、このコードは SQL インジェクションに対してオープンです。次に、どの要素が間違っているかを具体的に知りたい場合は、クエリを 2 つのコンポーネントに分解する必要があります (つまり、ユーザー名とパスワードを別々にクエリします)。

于 2012-06-29T10:48:17.170 に答える