| | Programma per un login... | |
| | Autore | Messaggio |
---|
darkjoker Admin
Numero di messaggi : 813 Data d'iscrizione : 30.07.07
| Titolo: Programma per un login... Ven Feb 01, 2008 12:36 am | |
| Il programma genera una schermata di login, le password saranno salvate in un file chiamato db.txt, con la seguente sintassi: - Codice:
-
username password
ogni riga del database sarà cosi, la "query" (chimiamola così) raccoglierà prenderà l' username e la password inserite dall'utente e le unirà in un'unica stringa, che avrà anch'essa la sintassi - Codice:
-
username password
e poi confronterà ogni riga del database con la stringa ottenuta... Non proprio sicurissimo... ma ho creato questo programma visto che non avevo niente da fare e mi è venuto lo spunto dopo aver letto il programma di un buffone della mia scuola che si gasava perche ne aveva fatto uno che eseguiva il login di un solo utente, per giunta immutabile una volta compilato il programma visto che il programma era strutturato in questo modo durante l'azione di login: - Codice:
-
if ((username == "darkjoker") && (password == "mypassword")){ //cazzate varie... }
... e poi questo programma puo essere utile per chi non ha ancora molta dimestichezza con il C, in modo che si possa studiare un po' il codice, per questo l'ho commentato il piu possibile bye - Codice:
-
#include <stdio.h> #include <string.h> main (){ start: //dichiarazione variabili necessarie FILE *db; char pass [100]; char user [100]; char db_user_pass [200]; int scelta; printf ("Cosa vuoi fare?\n1. Login\n2. Registrati\n"); scanf ("%d", &scelta); if (scelta == 2){ db = fopen ("db.txt", "a"); if (db == NULL){ printf ("Impossibile aprire il database...\n"); //se si verifica qualche problema con il file, ritorna all'inizio del programma goto start; } //richiede i dati per il nuovo utente printf ("Inserire username nuovo:\n"); scanf ("%s", &user); printf ("Inserire password:\n"); scanf ("%s", &pass); fprintf (db, "\n%s %s", user, pass); //scrive sul file una nuova riga contenente l'user e la pass fclose (db); goto start; } else if (scelta == 1){ db = fopen ("db.txt", "r"); if (db == NULL){ printf ("Impossibile aprire il database...\n"); //se si verifica un'errore durante l'apertura, va all'inizio //potrebbe verificarsi questo errore quando non esiste ancora il file db.txt //se è la prima volta che usate il programma, allora prima registratevi cosi il file sarà creato goto start; } printf ("Inserire l'username:\n"); scanf ("%s", &user); printf ("Inserire la password:\n"); scanf ("%s", &pass); char space [] = " "; char nome [100]; //copia il nome utente in una nuova stringa, in modo da poter modificare in seguito una delle due senza dare problemi //alla copia //unificazione dell'username e della password, con in mezzo uno spazio strcpy (nome, user); strcat (user, space); strcat (user, pass); while (!feof (db)){//il programma continuerà a leggere dal fiel fino alla sua fine fgets (db_user_pass, sizeof (db_user_pass), db);//viene letta una riga di testo dal file if (!strcmp (user, db_user_pass)){ //se la comparazione tra la stringa del database e l'input utente è andata a buon termine, //allora entra char esci; printf ("\n\nLogin effettutato.\n"); printf ("Benvenuto, %s\n", nome); printf ("Premi q per uscire.\n"); //qui potete mettere i comandi che volete while (esci != 'q'){ scanf ("%c", &esci); } } } } else { printf ("\n\nScelta non consentita.\n\n"); goto start; } }
| |
| | | Lord_Blackout apprendista
Numero di messaggi : 15 Data d'iscrizione : 31.01.08
| Titolo: Re: Programma per un login... Ven Feb 01, 2008 4:30 pm | |
| Davvero bello...complimenti EDIT: Ho provato ha compilarlo ma mi da errore qua ---> FILE *db; Proprio all'inizio Soluzione? EDIT2: Niente, colpa mia, l'avevo compilato come file C e non C++
Ultima modifica di il Ven Feb 01, 2008 4:48 pm - modificato 1 volta. | |
| | | BlackLight Moderatore
Numero di messaggi : 277 Età : 37 Data d'iscrizione : 22.08.07
| Titolo: Re: Programma per un login... Ven Feb 01, 2008 4:40 pm | |
| Credo che dovrei metterti al rogo solo perché hai usato il goto, la più grande piaga della programmazione procedurale ormai da decenni evitata più del colera In ogni caso il codice è buono...solo qualche piccolo consiglio... - Codice:
-
printf ("Inserire l'username:\n"); scanf ("%s", &user); Usare un codice del genere per leggere una stringa spalanca le porte di un overflow, e inoltre l'operatore & non si dovrebbe usare nella scanf per leggere una stringa, che già di suo è un puntatore a char...correggi questo errorino ed effettua un controllo sul numero massimo di caratteri leggibili dalla scanf - Codice:
-
printf ("Inserire l'username:\n"); scanf ("%100s",user); oppure usa direttamente una fgets: - Codice:
-
printf ("Inserire l'username:\n"); fgets (user,sizeof(user),stdin); user[strlen(user)-1]=0; Attento al rischio overflow anche qui, dove non fai nessun controllo sulle dimensioni del buffer e le possibilità di copia oltre i confini possono essere serie: - Codice:
-
strcpy (nome, user); strcat (user, space); strcat (user, pass); E infine, sei sicuro che salvare i dati di autenticazione in chiaro in un file di testo sia una buona idea...? Magari, se proprio non vuoi usare un database, cripta la password in modo che se qualcuno entri in possesso del file, salvo brute force, ci possa fare poco. Va bene un qualsiasi algoritmo di hashing per criptarla, dalla crypt() di Unix che effettua un hashing basato su DES+MD5 con un salt da 16 bit ai classici MD5 o SHA1. | |
| | | darkjoker Admin
Numero di messaggi : 813 Data d'iscrizione : 30.07.07
| Titolo: Re: Programma per un login... Ven Feb 01, 2008 4:43 pm | |
| - Citazione :
Ho provato ha compilarlo ma mi da errore qua ---> FILE *db; a me non da nessun errore.. beh.. io volevo solo passare un po di tempo senza annoiarmi, ma tu black mi chiedi troppo XD | |
| | | Lord_Blackout apprendista
Numero di messaggi : 15 Data d'iscrizione : 31.01.08
| Titolo: Re: Programma per un login... Ven Feb 01, 2008 4:50 pm | |
| @darkjoker: Ho editato per la seconda volta il mio messaggio, leggilo....era un mio errore XD | |
| | | BlackLight Moderatore
Numero di messaggi : 277 Età : 37 Data d'iscrizione : 22.08.07
| Titolo: Re: Programma per un login... Ven Feb 01, 2008 5:00 pm | |
| - darkjoker ha scritto:
- beh.. io volevo solo passare un po di tempo senza annoiarmi, ma tu black mi chiedi troppo XD
Ma no, basta inserire un po' di controlli in più e sei a posto Inoltre strano che la scanf a cui passi la stringa come puntatore a puntatore non ti dia errore...in genere gcc dà sempre almeno un warning in quei casi (tipo di dato incompatibile o cast richiesto), specie se compili con -Wall. In molti casi potresti anche avere dei malfunzionamenti del programma in quel modo, in quanto provi a salvare un buffer non nel puntatore identificato da user e pass ma nel suo puntatore a puntatore, che potrebbe identificare un'altra zona di memoria (e, finché la zona di memoria è nello stesso stack del processo, sei a posto, al massimo avrai solo una stringa illeggibile, ma se è in un indirizzo esterno hai una bella segmentation fault). In ogni caso mettendo a posto questo paio di cosine dovresti riuscire a tirar fuori un bel lavoro Altra cosa...l'etichetta start l'hai messa all'inizio della dichiarazioni delle variabili. Questo non dovrebbe mai essere fatto, in quanto così facendo ridichiari daccapo le variabili già dichiarate nel codice. Anzi, se compili il codice con un compilatore g++ non dovresti avere errori, in quanto la dichiarazione delle variabili viene vista come una normale istruzione...ma se compili con gcc o un compilatore ANSI-C puro hai eccome degli errori, in quanto l'etichetta viene vista come una parte di codice da tenere distinta dalla parte dichiarativa. È per questo probabilmente che Lord ha quell'errore in fase di compilazione...prendi questo codice e prova a compilarlo con un compilatore C: - Codice:
-
#include <stdio.h>
main() { start: int i;
i=0;
if (i<10) { printf ("%d\n",++i); goto start; } } Otterrai un errore del genere: - Codice:
-
blacklight@nightmare:~/prog/c$ gcc -o 7 7.c 7.c: In function `main': 7.c:5: error: syntax error before "int" 7.c:7: error: `i' undeclared (first use in this function) 7.c:7: error: (Each undeclared identifier is reported only once 7.c:7: error: for each function it appears in.) dovuto al fatto che il compilatore vedendo l'etichetta inizializza già il segmento .text (parte di codice), e dopo averlo inizializzato non può sapere che dopo l'inizio del .text ci sia la dichiarazione di alcune variabili (collocate in genere nel segmento .data). | |
| | | The_Nano93 membro
Numero di messaggi : 104 Età : 1016 Localizzazione : Da qualche parte nell'universo.... Data d'iscrizione : 28.09.07
| Titolo: Re: Programma per un login... Ven Feb 01, 2008 5:02 pm | |
| bravo darkjoker! però sarebbe meglio con i codici di blacklight | |
| | | Contenuto sponsorizzato
| Titolo: Re: Programma per un login... | |
| |
| | | | Programma per un login... | |
|
Argomenti simili | |
|
| Permessi in questa sezione del forum: | Non puoi rispondere agli argomenti in questo forum.
| |
| |
| |