In che modo l'uso di #define per i limiti del ciclo e delle condizioni in C aumenta la sicurezza?

0

Il mio programma utilizza le seguenti istruzioni di definizione:

#define LOWEST_PATIENT_ID 10000
#define HIGHEST_PATIENT_ID 99999
#define LOWEST_CRITICAL_STATUS 1
#define HIGHEST_CRITICAL_STATUS 100

usato in questo tipo di codice:

do{
   scanf("%d", &c_status);
   }while((c_status<LOWEST_CRITICAL_STATUS)
           ||(c_status>HIGHEST_CRITICAL_STATUS));

Non sono chiaro su come questo sia più sicuro. o è l'affermazione typedef che è sicuro?

    
posta Adel 29.02.2012 - 17:17
fonte

4 risposte

5

Gli indici, i limiti, i limiti, ecc. sono sempre correlati alla sicurezza con il codice C a causa di problemi di sfruttamento dell'overflow. In particolare, se ottieni il numero sbagliato, il codice è un candidato per lo sfruttamento.

Assegnare la costante a un simbolo fa due cose: rende il numero più facile da verificare in una revisione perché è immediatamente ovvio che cosa significa il numero e, cosa più importante, garantisce che ogni volta che usi il numero nel tuo codice, tu stai usando il valore SAME.

Immaginate, per esempio, dove il numero rappresenti la lunghezza del campo di input, e ad un certo punto aumenti quella lunghezza per accogliere nomi più grandi. Se hai specificato il valore numericamente nel tuo codice, devi rintracciare ogni istanza di quel numero e sostituirlo, ma solo se l'istanza di quel numero rappresenta il tuo campo specifico (non puoi semplicemente usare la ricerca e sostituire cambia ogni istanza da 128 a 256 perché il numero potrebbe significare cose diverse).

Inoltre, in alcuni casi potresti utilizzare N + 1 (ad esempio per consentire la terminazione), quindi dovresti rintracciare ogni istanza di 128 e ogni istanza di 129. E c'era un motivo per specificare 130 come bene? Oh, ora è difficile da ricordare. Ma non perderti nessuno di essi creerai un classico exploit di buffer overflow.

Se invece hai appena fatto #define FIRST_NAME_LENGTH 128 in uno dei tuoi file di inclusione e hai eliminato tutti i valori corrispondenti, puoi semplicemente cambiare il numero una volta e completarlo.

Questo è vero anche nei casi in cui si usa il numero una sola volta, perché mentre si sta ATTUALMENTE solo usando il numero una volta, qualcuno potrebbe aver bisogno di estendere il codice in futuro.

Questo è un problema così importante che dovresti aver imparato dal primo giorno per evitare "numeri magici" nel tuo codice. Se il numero "significa" qualcosa, dovresti renderne esplicito il significato.

    
risposta data 29.02.2012 - 20:20
fonte
2

Non lo è.

Le istruzioni

#define in C non sono davvero utili per la sicurezza. L'uso che li metti qui è un mezzo per migliorare la leggibilità (e se ciò è discutibile) e di avere quelle che sono, in effetti, variabili globali nel file senza doversi preoccupare dell'ambito dell'ambito.

    
risposta data 29.02.2012 - 17:22
fonte
1

Possono fornire un grado di protezione dagli attacchi di tipo overflow del buffer, poiché l'intervallo dell'indice del ciclo è limitato da un valore codificato (presumibilmente in un'area di memoria di sola lettura) anziché essere memorizzato in un formato scrivibile variabile.

    
risposta data 29.02.2012 - 18:25
fonte
1

In questo caso particolare, non si tratta tanto di sicurezza quanto di leggibilità e manutenibilità.

LOWEST_CRITICAL_STATUS e HIGHEST_CRITICAL_STATUS trasmettono più significato di un letterale 1 e 100 do. Inoltre, se il valore di uno dei due simboli deve cambiare, devi solo cambiarlo in un posto, invece di cercare ogni occorrenza di un 1 o 100 nel codice sorgente (capendo che potrebbero esserci alcune occorrenze di 1 o 100 che non dovrebbe cambiare).

    
risposta data 29.02.2012 - 20:37
fonte

Leggi altre domande sui tag