2017-06-27 9 views
-5

Ich schreibe ein Programm (vor allem Bildungszweck, aber wenn ich es mag, werde ich wahrscheinlich später in einem größeren Projekt verwenden) für Benutzernamen + Passwort-Authentifizierung. Was ich bis jetzt "gearbeitet" habe, bedeutet, dass es keine Fehler gibt, aber es verhält sich etwas komisch. Es hat STUFF() etwa 9 Mal ausgeführt (ich habe die genaue Ausgabe nicht gespeichert), bevor es beendet wurde, wenn es nur einmal gemacht werden soll.Benutzername und Passwort zu überprüfen

Wie kann ich STUFF() nur einmal machen? Wie kann ich die Passworteingabe unsichtbar machen? Und wie kann ich generell Sicherheit/Syntax verbessern oder kürzer machen?

#include <iostream> 
using namespace std; 

void STUFF() 
{ 
    cout << "Doing stuff..." << endl; 
} 

int CREDS; 
void AUTH() 
{ 
    cout << "Username: "; string USER; cin >> USER; 
    cout << "Password: "; string PASS; cin >> PASS; 
    if (USER == "josh" and PASS == "passwd") 
    { 
     CREDS = 0; 
    } 
    else 
    { 
     CREDS = 1; 
    }; 
} 

void RETRY() 
{ 
    cout << "Authentication failed! Try again? [Y/n]" << endl; char REPLY; cin >> REPLY; 
    if (REPLY == 'Y' or REPLY == 'y') 
    { 
     AUTH(); 
    } 
    else if (REPLY == 'N' or REPLY == 'n') 
    { 
     cout << "Exiting..." << endl; 
    } 
    else 
    { 
     RETRY(); 
    }; 
} 

int main() 
{ 
    AUTH(); 
    if (CREDS == 0) 
    { 
     STUFF(); 
     return 0; 
    } 
    else if (CREDS == 1) 
    { 
     RETRY(); 
    }; 

} 
+0

Kann nicht reproduzieren: https://ideone.com/EPnGn4 – mascoj

+0

Auch Ihr RETRY-Code wird sich nicht so verhalten, wie Sie es erwarten. Es wird nicht zurückgeschleift, selbst wenn Sie "Y" eingeben, wird das Programm beendet. – mascoj

+0

Ich testete erneut (es ist ein Punkt, um Benutzer zu erhalten und falsch zu wiederholen). Wählen Sie nicht aus und wählen Sie ja, dann bekommen Sie richtig, nur verlassen, ohne etwas zu tun. EDIT: reproduzierte das Ergebnis noch zwei Mal dann bekam der Benutzer/pass das erste Mal richtig und es gedruckt "Auth fehlgeschlagen! Versuchen Sie es erneut?" genau 9 mal – Josh

Antwort

0

Ich habe das letzte Programm aufgegeben und schrieb das von Grund auf neu. Für jeden, der neu in C++ ist, der dies verwenden möchte, ist es unter der GNU GPLv2 lizenziert und kann in Small-Projects-Cpp auf Github gefunden werden. Laden Sie einfach "Userpass.zip" herunter, da das gesamte Repository nicht geklont werden muss.

getpass() lässt die Passworteingabe Sternchen anzeigen. Nicht gerade unsichtbar, aber wahrscheinlich die beste Lösung dafür.

using namespace std; 
string PASSWD; 
string getPASS() 
{ 
    termios oldt; 
    tcgetattr(STDIN_FILENO, &oldt); 
    termios newt = oldt; 
    newt.c_lflag &= ~ECHO; 
    tcsetattr(STDIN_FILENO, TCSANOW, &newt); 
    string PASS; 
    cout << "Password: "; cin >> PASS; cout << endl; 
    tcsetattr(STDIN_FILENO, TCSANOW, &oldt); 
    return PASS; 
    } 

MENU() hat einen Schalter/Fall-Menü, aber es ist nicht verwandt, so dass es in dem asnwer ich bin zu überspringen. Sie können es durch irgendwelche Funktionen ersetzen, die Sie wollen.

int attempts = 0; 
int main() 
{ 

    while (attempts == 3) 
    { 
     cout << "Too many attempts have been made! Exiting..." << endl; exit(0); 
    }; 
    string USER; 
    cout << "Username: "; cin >> USER; 

    if (USER == "josh") 
     { 
      if (getPASS() == "hsoj") 
     { 
     cout << "\nAccess granted!\n" << endl; 
     MENU(); 
     } 
      else 
     { 
      cout << "\nAccess denied!\n" << endl; 
     attempts = attempts + 1; 
     main(); 
     }; 
    } 
    else 
    { 
     cout << "\nAccess denied!\n" << endl; 
     attempts = attempts + 1; 
     main(); 
    }; 
    return 0; 
} 
Verwandte Themen