Problem z programem o logowaniu (podaj login, haslo itp)

0

Hej! Mam lekki problem z programem, w którym trzeba się zalogować (podać login i hasło, a program ma sprawdzić czy wszystko jest ok, czy nie). Nie wiem dlaczego wszystko idzie doskonale do momentu gdy poda się zły login (bądź hasło). Wypisuje mi wtedy oczywiście, że jest błąd i prosi o powtórzenie próby logowania, ale wtedy gdy się da i tak czy siak np. zły login i dobre hasło to kończy program :( Jestem początkujący w programowaniu dlatego bardzo proszę o podpowiedzi jako iż nie chcę się uczyć na błędach. Z góry dziękuję!!!

program:

#include <iostream>

using namespace std;

int main()
{
    string login,haslo;

    cout<<"Podaj login: ";
    cin>>login;

    cout<<"Podaj haslo: ";
    cin>>haslo;

    if((login=="admin")&&(haslo=="maslo"))
    {
        cout<<"zalogowales sie!"<<endl;
    }
    else
    {
        do { 
                cout<<"Podany login lub haslo jest nieprawidlowe. Sprobuj ponownie: "<<endl;
                cout<<"Podaj login: ";
                cin>>login;

                cout<<"Podaj haslo: ";
                cin>>haslo;
            } while((login!="admin")&&(haslo!="maslo"));

            if((login=="admin")&&(haslo=="maslo"))
                {
                   cout<<"zalogowales sie!"<<endl;
                }
    }
    return 0;
}
2
pierożki z masełkiem napisał(a):
        } while((login!="admin")&&(haslo!="maslo"));

W tej linii jest problem

3

Jedyne co wpisałem to true jako warunek w while oraz break reszta wzięta z twego kodu:

#include <iostream>
using namespace std;

int main()
{
    while(true)
    {
        string login,haslo;
        cout<<"Podaj login: ";
        cin>>login;
        cout<<"Podaj haslo: ";
        cin>>haslo;
        if((login=="admin")&&(haslo=="maslo")) break;
        cout<<"Podany login lub haslo jest nieprawidlowe. Sprobuj ponownie: "<<endl;
    }
    cout<<"zalogowales sie!"<<endl;
    return 0;
}

Zauważ że po daniu prostej funkcji kod staje się zupełnie prymitywnym:

#include <iostream>
#include <iterator>
#include <string>
using namespace std;

string input() { return *(istream_iterator<string>{cin}); }
bool prompt(const string &field) { return cout<<"Podaj "<<field<<": "; }
bool checkinput(const string &field,const string &good) { return (prompt(field))&&(input()==good); }

int main()
{
    while((!checkinput("login","admin"))||(!checkinput("haslo","maslo")))
    {
        cout<<"Podany login lub haslo jest nieprawidlowe. Sprobuj ponownie."<<endl;
    }
    cout<<"zalogowales sie!"<<endl;
    return 0;
}
4

Jako ciekawostka, logowanie z autoryzacją dla wielu użytkowników. Możesz na tym przykładzie zobaczyć co ciekawego przyniesie ci nauka kolejnych elementów biblioteki standardowej.
Tylko broń boże nie używaj tego poza własnym zaciszem bez bcryptowania haseł.

#include <iostream>
#include <string>
#include <unordered_map>
#include <optional>
using namespace std;

template<typename T>
T input(string const &msg = "") {
    cout << msg;
    T result;
    cin >> result;
    return result;
}

using users_map = unordered_map<string, string>;

struct auth_credential {
    string username;
};

optional<auth_credential> authorize(users_map const &users, size_t attempts = 3) {
    while (attempts --> 0) {
        auto login = input<string>("Podaj login: ");
        auto password = input<string>("Podaj haslo: ");
        if (users.count(login) && users.at(login) == password) {
            return auth_credential { login };
        }
        cout << "Podany login lub haslo sa nieprawidlowe" << endl;
    }
    cout << "Za duzo niepoprawnych prob zalogowania" << endl;
    return {};
}

int main() {
    users_map users = {
        { "admin", "maslo" },
        { "kocopol", "wariat" }
    };

    auto auth = [&users] { return authorize(users); };

    if (auto credentials = auth()) {
        cout << "Poprawnie autoryzowano uzytkownika " << credentials->username << endl;
    } else {
        cout << "Brak autoryzacji" << endl;
    }

    return 0;
}

poprawne logowanie: https://wandbox.org/permlink/uAs2osx6ZcTpo8pk
niepoprawne logowanie: https://wandbox.org/permlink/QIkTygru7KGajLZq

1

@spartanPAGE:

Tylko broń boże nie używaj tego poza własnym zaciszem bez bcryptowania haseł.

a nie lepiej gdyby od razu do kodowanie haseł użył sha512 i taki hash od razu wysyłał w świat ?

1

@spartanPAGE:
zastanawia mnie ten kawałek kodu

optional<auth_credential> authorize(users_map const &users, size_t attempts = 3)

widzę, że dajesz szansę na 3 próby logowania. I zestaw pytań konkursowych ?

  1. Jak rozwiążesz problem że user przekroczył te 3 próby i ani jednej więcej nie będzie mógł wykonać nawet po zamknięciu programu ? (licznik zliczy próby, zamkniesz program i znowu 3 szanse)
  2. zapiszesz gdzieś bardzo głęboko i w dodatku zaszyfrowany plik z dokładną datą, godziną, minutą, sekundą ?
  3. W jaki sposób uchronić się przed "crackiem" takiego programu by "nie wyśledzić" gdzie program zapisał ten plik ?
  4. Jeżeli ponowna próba zalogowania się będzie możliwa po jakimś interwale czasu, to w jaki sposób to rozwiązać ?
  5. Inne rozwiązanie ? Jakie ?
1

@zkubinski Bez udziału serwera problem nie do rozwiązania.
Przecież zawsze można zrobić obraz dysku a po 3-ch nieudanych próbach odtworzyć.

0

@_13th_Dragon:

Bez udziału serwera problem nie do rozwiązania.

Dlaczego ? Na sesję serwerową jakoś zliczają te "próby"

Przecież zawsze można zrobić obraz dysku a po 3-ch nieudanych próbach odtworzyć.

Wyobraź sobie setki userów dla każdego błędnie zalogowanego usera trzeba robić obraz dysku ? (serwerowego ?) Nie bardzo rozumiem tą ideę

0

@zkubinski: 1-5: nie rozwiąże, bo jakakolwiek realnie bezpieczna autoryzacja powinna odbywać gdzieś na backendzie przez fajny endpoint, poza dostępem użytkownika. Tak długo jak całość użytkownik ma na swoim urządzeniu, to po prostu da się taką autoryzację obejść. Co przy edukacyjnym projekcie nie stanowi żadnego problemu tak długo jak jakieś nagie, używane w innych miejscach hasło nie trafi w obce ręce.

0

To może przy okazji tego wątku zadam takie pytanie.

Czy takie Qt dysponuje jakąś klasą do obsługi SSL lub szyfrowania transmisji ? Czy trzeba się posiłkować jakimiś innymi bibliotekami szyfrującymi transmisję ? Jeżeli tak, to jakimi ?

Chodzi mi o takie coś.
Mam Wystawiony certyfikat SSL (lub wygenerowałem sobie własne centrum certyfikacyjne SSL dla własnego serwera i własnej aplikacji którą używam tylko ja)

Czy taki program będzie w stanie wyświetlić monit coś na zasadzie
"patrz jest certyfikat SSL akceptujesz" ?
wygasł certyfikat
"patrz certfikat wygasł wygeneruj nowy i zaloguj się" ?

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