Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [C] Controllare buffer

  1. #1

    [C] Controllare buffer

    Siccome vorrei rendere un minimo sicure le mie applicazioni in C vorrei controllare il buffer immesso, ad esempio, durante l'esecuzione del programma durante una normale scanf(). Come posso controllare che il buffer inserito non strafori da quello dichiarato nella variabile? Va bene un sizeof?

    Esempio: ho una variabile char con un buffer di 1024 (byte giusto?). se faccio

    if((sizeof(variabile)) > 1024) printf ("Buffer inserito troppo grande!\n");

    Dite che va bene per controllare il buffer inserito ed evitare il buffer overflow su quella variabile?
    Powered by Linux

    "Windows cerca di fare Unix e ci riesce male, Red Hat cerca di fare Windows e ci riesce benissimo" (Jimmy Olgeni)

  2. #2
    Utente di HTML.it L'avatar di DydBoy
    Registrato dal
    Jul 2005
    Messaggi
    165
    char string [100];

    fgets (string , 100 , stdin);

    Prova in questo modo

  3. #3
    Ti rigrazio

    A titolo puramente informativo... potrebbe andare bene anche un controllo fatto con strlen al posto di sizeof?
    Powered by Linux

    "Windows cerca di fare Unix e ci riesce male, Red Hat cerca di fare Windows e ci riesce benissimo" (Jimmy Olgeni)

  4. #4
    Utente di HTML.it L'avatar di DydBoy
    Registrato dal
    Jul 2005
    Messaggi
    165
    Lo strlen() lo fai sulla stringa una volta che questa e' stata inserita e non risulta utile per cio' che hai in mente di fare.

    Mi spiego meglio : se il buffer e' di 10 caratteri e chiami uno scanf nel quale inserisci una stringa di 15 il programma si blocca e va in "Segmentation Fault" perche' non riesce ad allocare tutta la stringa nel buffer definito.

    Con la fgets hai la certezza che saranno memorizzati solo i primi N caratteri e cercherai di far coincidere N con la grandezza del tuo buffer in modo che non ci possano essere Buffer Overflows.

    Spero di averti aiutato.

    Ciao!

  5. #5
    come si fa ad evitare il buffer overflow che può provenire dai parametri passati via linea di comando? (tipo se uno col copia e incolla passa a un programma un parametro lunghissimo)
    - Sean von Drake

    http://www.videoarts.eu/ realizzazione siti web bologna

    "Sono un servitore del fuoco segreto, e reggo la Fiamma di Anor."

  6. #6
    DydBoy lo stesso ragionamento lo avevo fatto con sizeof() ieri sera prima di addormentarmi... non ho proprio nulla da fare

    Il controllo dopo non serve a nulla

    Vediamo se qualcuno risponde a sean_von_drake che interessa anche a me
    Powered by Linux

    "Windows cerca di fare Unix e ci riesce male, Red Hat cerca di fare Windows e ci riesce benissimo" (Jimmy Olgeni)

  7. #7
    Originariamente inviato da sean_von_drake
    come si fa ad evitare il buffer overflow che può provenire dai parametri passati via linea di comando? (tipo se uno col copia e incolla passa a un programma un parametro lunghissimo)
    I parametri da riga di comando sono accessibili mediante il secondo parametro di main():

    codice:
    char* argv[]
    si tratta quindi di gestire una copia tra buffer in modo non dissimile dal solito modo, avendo cura di copiare al massimo una quantita` di byte pari alla dimensione del buffer di destinazione e, nel caso il buffer debba contenere stringhe stile C, di assicurarsi che l'ultimo carattere dello stesso sia '\0'.

    Ad esempio:

    codice:
    char buffer[BUF_SIZE];
    strncpy(buffer, argv[1], BUF_SIZE-1);
    buffer[BUF_SIZE-1] = '\0';
    Dovrebbe essere piu` o meno giusto, a parte errori di off-by-one che mi scappano sempre quando non dovrebbero
    "Qualsiasi esperto ha paura di combattere usando la katana vera. Anch'io. Ma non ignoro la mia paura, riesco ad accettarla, e a metterla da parte accanto a me".

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.