Logowanie, porownanie wartosci

0

Cześć wszystkim.
Poniżej znajduje się kod którego nie za bardzo rozumiem, mimo, że jak mi się wydaj - działa. Czy można taki zapis rozłożyć na czynniki pierwsze by widać było gdzie następuje porównanie wartości z textboxow i rekordów tabeli?

W jaki sposób należało by go zmodyfikować, aby porównywał zawartość (TextBox1) & (TextBox2) z (Nazwa_uzytkownika) & (Haslo_uzytkowanika) z bazy danych oraz jeśli (typ_uzytkowanika) w bazie danych byłby dla tego użytkownika = x to robił jedno, a gdyby y to drugie.

protected void Button1_Click(object sender, EventArgs e)
        {
            OleDbConnection my_con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Logoowanie\projekty.accdb");
            my_con.Open();

            try
            {
                string uid = TextBox1.Text;
                string pass = TextBox2.Text;

                string qry = "select * from projects where Nazwa_uzytkownika='" + uid + "' and Haslo_uzytkowanika='" + pass + "'";

                OleDbCommand cmd = new OleDbCommand(qry, my_con);
                OleDbDataReader sdr = cmd.ExecuteReader();

                if (sdr.Read())
                {
                        Response.Redirect("About.aspx");
                }
                else
                {
                    Label1.Text = "UserId & Password Is not correct Try again..!!";
                }
                my_con.Close();
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
        }
0

Pobierasz dane z formularza (login i hasło)

string uid = TextBox1.Text;
string pass = TextBox2.Text;

Tworzysz zapytanie do bazy danych, w którym wyszukujesz użytkownika po wybranych kryteriach

string qry = "select * from projects where Nazwa_uzytkownika='" + uid + "' and Haslo_uzytkowanika='" + pass + "'";
OleDbCommand cmd = new OleDbCommand(qry, my_con);
OleDbDataReader sdr = cmd.ExecuteReader();

Jeżeli baza danych zwróciła jakiś rekord to znaczy, że udało sie znaleźć użytkownika. Jeżeli brak tekstu to error

                if (sdr.Read())
                {
                        Response.Redirect("About.aspx");
                }
                else
                {
                    Label1.Text = "UserId & Password Is not correct Try again..!!";
                }

jeżeli chcesz więcej informacji polecam wbijać każde słowo którego nie rozumiesz w google i czytać dokumentację.

3

Nigdy nie wolno robić takich klocków jak Ty:
string qry = "select * from projects where Nazwa_uzytkownika='" + uid + "' and Haslo_uzytkowanika='" + pass + "'";

To jest zapytanie przygotowane do ataku "SQL Injection". Czyli dzięki temu można spreparować sobie właściwie dowolne zapytanie, które zostanie wykonane na Twojej bazie danych. Ale to nie wszystko. Można też się zalogować na konto administratora nie znając ani loginu, ani hasła. Jak? Poczytaj o SQL Injection :)

Aby tworzyć dynamicznie sqle używaj parametrów - DbParameter. W obiekcie OleDbCommand na pewno masz jakąś metodę, która tworzy parametr i wtedy robisz coś takiego (piszę z głowy, nie pamiętam dokładnie, ale jakoś tak to powinno być):

string sql = "SELECT * from projects where Nazwa_uzytkownika = :user and Haslo= :pass";
var userNameParam = command.CreateParameter();
userNameParam.Name = "user"; //albo ":user"
userNameParam.Value = loginTextBox.Text;

var passParam = command.CreateParameter();
passParam.Name = "pass";
passParam.Name = passTextBox.Text;

command.Parameters.Add(userNameParam);
command.Parameters.Add(passParam);

i dopiero wtedy możesz takie zapytanie wywołać. Parametry zapewnią Ci odpowiednie stworzenie takiego SQLa, nie pozwolą na SQL Injection, a także zatroszczą się same o typy - dlatego jak się przyjrzysz, to zobaczysz, że wartości :user i :pass w zapytaniu NIE SĄ ujęte w cudzysłów. To się stanie automatycznie z użyciem parametrów.

2

WebFormsy, SQL Injection, OleDb oraz MS Access

co to za combo, dlaczego? to jakiś istniejący projekt, a nie nowy, tak?

0

@Juhas: Mistrz!

Rozumiem, że kod musiałby wyglądać tak:

protected void Button1_Click(object sender, EventArgs e)
        {
            OleDbConnection my_con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Logowanie\projekty.accdb");
            my_con.Open();

            try
            {
                string qry = "SELECT * from projects where Nazwa_uzytkownika = :user and Haslo= :pass";

                var userNameParam = command.CreateParameter();
                userNameParam.Name = ":user"
                userNameParam.Value = loginTextBox1.Text;

                var passParam = command.CreateParameter();
                passParam.Name = ":pass";
                passParam.Value = passTextBox2.Text;

                command.Parameters.Add(userNameParam);
                command.Parameters.Add(passParam);

                OleDbCommand cmd = new OleDbCommand(qry, my_con);
                OleDbDataReader sdr = cmd.ExecuteReader();

                if (sdr.Read())
                {
                        Response.Redirect("About.aspx");
                }
                else
                {
                    Label1.Text = "UserId & Password Is not correct Try again..!!";
                }
                my_con.Close();
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }
        }

Jak tylko teraz uzależnić jeszcze wywołanie Response.Redirect("About.aspx"); od sprawdzenia, czy do tego (Nazwa_uzytkowanika) i (haslo_uzytkowanika) przypisany jest x, czy y jako (Typ_uzytkownika)? If w if'ie?

0

@WeiXiao: WebForms i Ms Access tak, co do reszty to nie mam pojęcia o co chodzi ;)

0

@Neosphoros

Są "zręczniejsze" sposoby na pracę z bazą niż cuda typu sdr.Read()

Przykładowo Dapper - nie używałem go nigdy z Accessem, ale wydaje mi się że będzie działać.

string sql = "INSERT INTO Customers (CustomerName) Values (@CustomerName);";

using (var connection = new SqlConnection(ConnectionString))
{
      var affectedRows = connection.Execute(sql, new {CustomerName = "Mark"});
      var customer = connection.Query<Customer>("SELECT * FROM CUSTOMERS WHERE CustomerName = 'Mark'").ToList();

      ...
}

A co do WebFormsów, no to po prostu nie są wspierane ASP.NET Web Forms isn't supported in .NET Core oraz są bardziej współczesne technologie i jeżeli piszesz coś od 0, to nie ma sensu tego robić w WebFormsach.

Nawet jest dokument nt. migrowania z WebFormsów

Strategies for migrating ASP.NET Web Forms apps

0

Jezusiu kochany... zlitujcie się. Ja jestem prostym biednym początkującym programistą. Doradźcie coś w miarę bezpiecznego i prostego do zrozumienia, a nie mi tu jakąś magię pokazujecie :D

0

@Juhas:

Po zmianie na:

protected void Button1_Click(object sender, EventArgs e)
        {
            OleDbConnection my_con = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Projekty\VisualStudio\2022\Logoowanie\Logoowanie\projekty.accdb");
            my_con.Open();

            try
            {
                string qry = "SELECT * from projects where User_name = :user and User_password= :pass";

                var userNameParam = command.CreateParameter();
                userNameParam.Name = ":user";
                userNameParam.Value = TextBox1.Text;

                var passParam = command.CreateParameter();
                passParam.Name = ":pass";
                passParam.Value = TextBox2.Text;

                command.Parameters.Add(userNameParam);
                command.Parameters.Add(passParam);

                OleDbCommand cmd = new OleDbCommand(qry, my_con);
                OleDbDataReader sdr = cmd.ExecuteReader();

                 if (sdr.Read())
                {
                        Response.Redirect("About.aspx");
                }
                else
                {
                    Label1.Text = "UserId & Password Is not correct Try again..!!";
                }
                my_con.Close();
            }
            catch (Exception ex)
            {
                Response.Write(ex.Message);
            }

        }

Podkreśla użyte zwroty command użyte w składni, wskazując, że "nazwa "command" nie istnieje w bieżącym kontekście.

0

No pewnie, że nie istnieje, bo nie utworzyłeś tego :/ Ten command to jest Twój OleDbCommand, którego używasz. Czyli musisz to utworzyć wcześniej i posługiwać się cmd... ech...

string sql = "SELECT....";

OleDbCommand cmd = new OleDbCommand(sql, my_con);
var userNameParam = cmd.CreateParameter(); //..itd

Pamiętaj, że nie dałem Ci gotowego kodu. Nie pamiętam, czy istnieje metoda CreateParameter(), czy może CreateParameter(nazwa). Pokazałem Ci jak to powinno ogólnie wyglądać. Teraz musisz to przeanalizować i zrozumieć.

0

@Juhas:

Może coś takiego?

protected void Login_Click(object sender, EventArgs e)
        {
            string connect = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Logowanie\projekty.accdb";

            string query = "Select Count(*) From projects Where User_name = ? And User_password = ?";
            int result = 0;
            using (OleDbConnection conn = new OleDbConnection(connect))
            {
                using (OleDbCommand cmd = new OleDbCommand(query, conn))
                {
                    cmd.Parameters.AddWithValue("", UserName.Text);
                    cmd.Parameters.AddWithValue("", Password.Text);
                    conn.Open();
                    Session["User"] = UserName.Text;
                    result = (int)cmd.ExecuteScalar();
                }
            }
            if (result > 0)
            {
                Response.Redirect("About.aspx");
            }
            else
            {
                Literal1.Text = "Invalid credentials";
            }
        }
0

Jest prawie ok, ale musisz jeszcze otworzyć połączenie.

0

@Juhas:

...a to nie jest to?:

conn.Open();

0

Aj sorry jasne. Nie zauważyłem. Nie jestem pewien, czy zadziała tworzenie parametrów przed otwarcie przed otwarciem połączenia. Ale po prostu sprawdź.

0

@Juhas:

Niby wszystko działa. I to jest ta bezpieczna metoda?

A czy jest możliwość aby przed przekierowaniem sprawdzany byl jeszcze warunek z 3 kolumny (account_type) i w zależności od tego co jest przypisane do określonego użytkowania - przekierowywało do odpowiedniej strony?

Nie za bardzo rozumiem jak ma się "string query" do zmiennej o którą można zapytać w if'ie

1 użytkowników online, w tym zalogowanych: 0, gości: 1