Xhack
Vuoi reagire a questo messaggio? Crea un account in pochi click o accedi per continuare.
Xhack

Un forum dedicato all'hacking
 
IndiceIndice  PortalePortale  CercaCerca  Ultime immaginiUltime immagini  RegistratiRegistrati  Accedi  

 

 Programma per un login...

Andare in basso 
4 partecipanti
AutoreMessaggio
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

Programma per un login... Empty
MessaggioTitolo: Programma per un login...   Programma per un login... EmptyVen 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 Wink

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;
    }
}
Torna in alto Andare in basso
Lord_Blackout
apprendista
apprendista



Numero di messaggi : 15
Data d'iscrizione : 31.01.08

Programma per un login... Empty
MessaggioTitolo: Re: Programma per un login...   Programma per un login... EmptyVen Feb 01, 2008 4:30 pm

Davvero bello...complimenti

EDIT: Ho provato ha compilarlo ma mi da errore qua ---> FILE *db;
Proprio all'inizio Very Happy
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.
Torna in alto Andare in basso
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

Programma per un login... Empty
MessaggioTitolo: Re: Programma per un login...   Programma per un login... EmptyVen 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 Very Happy

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...? Very Happy
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.
Torna in alto Andare in basso
http://blacklight.gotdns.org
darkjoker
Admin
Admin
darkjoker


Numero di messaggi : 813
Data d'iscrizione : 30.07.07

Programma per un login... Empty
MessaggioTitolo: Re: Programma per un login...   Programma per un login... EmptyVen 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 Very Happy
Torna in alto Andare in basso
Lord_Blackout
apprendista
apprendista



Numero di messaggi : 15
Data d'iscrizione : 31.01.08

Programma per un login... Empty
MessaggioTitolo: Re: Programma per un login...   Programma per un login... EmptyVen Feb 01, 2008 4:50 pm

@darkjoker: Ho editato per la seconda volta il mio messaggio, leggilo....era un mio errore XD
Torna in alto Andare in basso
BlackLight
Moderatore
Moderatore
BlackLight


Numero di messaggi : 277
Età : 37
Data d'iscrizione : 22.08.07

Programma per un login... Empty
MessaggioTitolo: Re: Programma per un login...   Programma per un login... EmptyVen 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

Laughing
Ma no, basta inserire un po' di controlli in più e sei a posto Wink
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 Wink

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).
Torna in alto Andare in basso
http://blacklight.gotdns.org
The_Nano93
membro
membro
The_Nano93


Numero di messaggi : 104
Età : 1016
Localizzazione : Da qualche parte nell'universo....
Data d'iscrizione : 28.09.07

Programma per un login... Empty
MessaggioTitolo: Re: Programma per un login...   Programma per un login... EmptyVen Feb 01, 2008 5:02 pm

bravo darkjoker! però sarebbe meglio con i codici di blacklight
Torna in alto Andare in basso
Contenuto sponsorizzato





Programma per un login... Empty
MessaggioTitolo: Re: Programma per un login...   Programma per un login... Empty

Torna in alto Andare in basso
 
Programma per un login...
Torna in alto 
Pagina 1 di 1
 Argomenti simili
-
» [C#]Consiglio in programma...(calcolatrice)
» mettere un programma all'avvio e spostarlo
» Script Login

Permessi in questa sezione del forum:Non puoi rispondere agli argomenti in questo forum.
Xhack :: Programmazione :: C/C++-
Vai verso: