2012-04-01 9 views
8

Estoy inicializando una cadena mutable y luego registrándola de la siguiente manera.¿Por qué mi cadena es potencialmente insegura en mi aplicación iOS?

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

el código funciona y funciona, pero estoy recibiendo una advertencia extraño (en amarillo):

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

¿Por qué?

+0

Los errores de formato surgen porque las convenciones de paso de argumentos de C no son seguras para el tipo. –

Respuesta

10

Bueno, hay algunos problemas aquí.

El primero (y no el que ha preguntado) es que está asignando un nuevo NSMutableString y luego simplemente tirándolo en la segunda línea cuando lo establece en someTextFieldIbOutlet.text. Además, está convirtiendo una cadena no mutable en una cadena mutable que no funcionará realmente. En su lugar, se combinan las dos primeras líneas de la siguiente manera:

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

El error real que vas a encontrar es causada porque el primer argumento de NSLog se supone que es la cadena "formato", que narra NSLog cómo desea dar formato a la datos que siguen en argumentos posteriores. Esto debería ser una cadena literal (creada como @"this is a literal string") para que no se pueda usar para explotar su programa al hacerle cambios.

su lugar, utilice la siguiente:

NSLog(@"%@", mStr); 

En este caso, la cadena de formato es @"%@" que significa "Crear un objeto NSString establecido en %@". %@ significa que el siguiente argumento es un objeto, y para reemplazar %@ con la descripción del objeto (que en este caso es el valor de la cadena).

+0

¿Por qué es potencialmente inseguro? – Claudiu

6

Si mStr se configuró en algo así como %@, NSLog intentaría cargar un argumento de objeto, falla y probablemente falle gravemente. Hay otras cadenas de formato que también pueden causar estragos.

Si necesita sólo tiene que entrar una cadena de texto sin ningún marcador, utilice:

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

El mStr que está aprobando se utiliza para formatear. Si esta cadena proviene de una fuente que no es de confianza, se puede usar para exploit your program si un atacante proporciona alguna entrada escrita correctamente.

Debe modificar el código para:

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

De esta manera, no importa lo que el contenido se almacena en mStr, no puede ser utilizado por un atacante para explotar su programa.

Este es un problema grave de seguridad; desde mi archivo local del CVE database, conté 520 instancias de vulnerabilidades de cadena de formato entre 1999 y principios de 2012.

+0

@lnafziger: gracias por la solución. – sarnold

+0

+1, gracias por la URL de wikipedia. –

Cuestiones relacionadas