Questa dichiarazione fprintf è potenzialmente vulnerabile?

5

Ecco la dichiarazione: fprintf(stderr, "Some random string\n").

Va bene non avere un identificatore di formato, come% s, anche se l'istruzione non accetta alcun input da parte dell'utente? E 'ancora potenzialmente sfruttabile? Sembra che dovrebbe comunque essere considerata una best practice per includere un identificatore di formato. Gradirei una certa chiarezza in merito. Grazie.

    
posta Paul Ivanivsky 02.04.2013 - 22:20
fonte

1 risposta

12

L'affermazione, come lo mostri, non è vulnerabile a nulla. Tuttavia, fprintf() è in effetti un interprete a pieno titolo: quello che prende come formato stringa non è solo una sequenza di caratteri; è un codice sorgente per una lingua specifica con direttive che iniziano con un segno '%'.

Quando usi la tua funzione fprintf() in questo modo, prima o poi, alcuni sviluppatori diventeranno tutti generici e virtuosi e fanatici dell'internazionalizzazione, e insisteranno per riscriverli in questo modo:

/* in some .h file */
#define MSG_EN_42   "Some random string\n"

#if LANGUAGE_IS_ENGLISH
#define MSG_42   MSG_EN_42
#endif

/* in another .c file */
fprintf(stderr, MSG_42);

Poi, alcune settimane / mesi / anni dopo, un altro sviluppatore, con poca conoscenza di C ma notevole conoscenza di tedesco / Thaï / Klingon, cambierà il file .h in modo simile a questo:

/* in some .h file */
#define MSG_EN_42   "Some random string\n"
#define MSG_KG_42   "fs'k5 f%n59 #$dsai!\n"

#if LANGUAGE_IS_ENGLISH
#define MSG_42   MSG_EN_42
#endif
#if LANGUAGE_IS_KLINGON
#define MSG_42   MSG_KG_42
#endif

E poi ne segue la difficoltà.

(A proposito, non è un vero esempio Klingon, l'uso di parole Klingon sul lettore ignaro sarebbe un po 'rude, ma tu hai l'idea.)

Per annullare questi problemi , utilizza una stringa di formato quando è necessaria una stringa di formato. Questo porterebbe a:

fprintf(stderr, "%s", "Some random string\n");

o, come soluzione più semplice:

fputs("Some random string\n", stderr);
    
risposta data 02.04.2013 - 22:32
fonte

Leggi altre domande sui tag