Printf non è sicuro da usare in C
Sono nuovo in C, quindi ho iniziato a giocare con un po 'di codice. Ho un bug nel mio codice perché credo che l'uso printf(pass)non sia sicuro da usare perché può sovrascrivere il valore e quindi non è sicuro per l'utente. Mi chiedevo se ho ragione a questo proposito che printf(pass)non è sicuro nel mio codice? Inoltre, come posso ancora consentire all'utente di stampare il messaggio finally logged insenza modificare il mio codice. C'è un modo per farlo?
Il mio codice:
#include <stdio.h>
char pass[100];
char getPass() {
int value = 'G';
int * j = & value;
fgets(pass, sizeof(pass), stdin);
printf("your entered pass is ");
printf(pass);
return (char)( * j);
}
void main() {
printf("enter the pass here ");
if (getPass() == 'K') {
printf("finally logged in\n");
exit(0);
} else {
printf("Wrong password\n");
exit(1);
}
}
Risposte
Sì, non è sicuro, ma non per il motivo che hai suggerito. Se controlli la manpagina per la printf()funzione, vedrai che ha il seguente prototipo:
int printf(const char * restrict format, ...);
Il constmodificatore applicato al primo argomento specifica che il valore di questo parametro non verrà modificato quando si chiama questa funzione.
Tuttavia, noterai anche che questo parametro viene chiamato format. Questo perché dovrebbe specificare una stringa di formato. Nel tuo programma, non c'è nulla che impedisca a un utente di inserire un identificatore di formato come %p, nel qual caso la tua chiamata a printf()inizierà a stampare il contenuto dello stack. C'è un articolo di Wikipedia che descrive questa vulnerabilità in modo più dettagliato.
La funzione, fgetsse la sua chiamata ha avuto successo, fornisce una stringa che puoi produrre.
Può sorgere un problema se la stringa ottenuta viene emessa in questo modo
printf(pass);
e contiene la conversione specifica.
Quindi invece di quella chiamata
printf(pass);
è più sicuro da usare
printf( "%s", pass );
o
puts(pass);
Preliminare è possibile rimuovere il nuovo carattere di riga memorizzato nella stringa dalla chiamata di fgets.