2012-04-01 24 views
8

Sto inizializzando una stringa mutabile e quindi la loggo come segue.Perché la mia stringa è potenzialmente non protetta nella mia applicazione iOS?

NSMutableString* mStr = [[NSMutableString alloc] init]; 
mStr = (NSMutableString*) someTextFieldIbOutlet.text; 
NSLog((NSString *) mStr); 

Le opere di codice e corre, ma io sono sempre uno strano avvertimento (in giallo):

Format string is not a string literal (potentially insecure). 

Perché?

+0

I bug di formato si presentano perché le convenzioni di passaggio di argomento di C non sono sicure per tipo. –

risposta

10

Beh, ci sono alcuni problemi qui.

Il primo (e non quello che hai chiesto) è che stai assegnando una nuova NSMutableString e poi semplicemente la butti via nella seconda riga quando la imposti su someTextFieldIbOutlet.text. Inoltre, stai trasmettendo una stringa non mutabile a una mutabile che in realtà non funzionerà. Invece, unire le prime due righe in questo modo:

NSMutableString* mStr = [NSMutableString stringWithString:someTextFieldIbOutlet.text]; 

L'errore effettivo che si stanno ottenendo è causato perché il primo argomento di NSLog dovrebbe essere la stringa "format", che racconta NSLog come si desidera formattare il dati che seguono in argomenti successivi. Questa dovrebbe essere una stringa letterale (creata come @"this is a literal string") in modo che non possa essere utilizzata per sfruttare il programma apportando modifiche.

Invece, usate questo:

NSLog(@"%@", mStr); 

In questo caso, la stringa di formato è @"%@" che significa "Creare un oggetto NSString impostato %@". %@ significa che l'argomento successivo è un oggetto e sostituire %@ con la descrizione dell'oggetto (che in questo caso è il valore della stringa).

+0

perché è potenzialmente insicuro? – Claudiu

6

Se mStr è stato impostato su qualcosa come %@, NSLog, si tenta di caricare un argomento oggetto, esito negativo e probabilmente si arresta gravemente. Ci sono altre stringhe di formato che possono anche causare il caos.

Se devi effettuare il login solo una stringa di testo senza alcun marcatore, utilizzare:

NSLog(@"%@", mStr); 
6

Il mStr che stai passando viene utilizzato per la formattazione. Se questa stringa proviene da una fonte non attendibile, può essere utilizzata per exploit your program se un utente malintenzionato fornisce un input correttamente scritto.

Si dovrebbe modificare il codice per:

NSLog(@"%@", (NSString *) mStr); 

In questo modo, non importa quale sia il contenuto è memorizzato in mStr, non può essere utilizzato da un aggressore per sfruttare il vostro programma.

Questo è un grave problema di sicurezza; dal mio archivio locale di CVE database, ho contato 520 istanze di vulnerabilità di stringa di formato tra il 1999 e l'inizio del 2012.

+0

@lnafziger: grazie per la correzione. – sarnold

+0

+1, grazie per l'URL di wikipedia. –

Problemi correlati