2011-03-25 11 views
53

Duplicar posibles:
SnowLeopard Xcode warning: “format not a string literal and no format arguments”problema con Código: Cadena de formato no es una cadena literal

estoy recibiendo el siguiente problema para esta línea de código.

"Cadena de formato no es una cadena literal (potencialmente insegura)"

NSLog([NSString stringWithFormat:@"%@", entered]); 

¿Alguna sugerencia?

+2

Hey Faisal, En realidad, esto se debe a que no ha escrito el especificador de cadena '@"% @ "' en la declaración NSLog. Solo mira mi respuesta. Espero que te ayude :) –

+0

@Parth Viejo hilo, buena ayuda, pero ¿por qué no como respuesta? – Neeku

+0

NSLog ([NSString stringWithFormat: @ "% @", ingresado], nil); – user501836

Respuesta

137

El compilador nos quiere usar una constante NSString para la cadena de formato (el primer argumento a NSLog) porque evita un exploit bastante conocido que podría violar la seguridad. Así, por ejemplo, podría cambiar el código que envió la siguiente manera para mantener el compilador feliz:

NSLog(@"%@", [NSString stringWithFormat:@"%@", entered]); 

EDITAR

Y, por supuesto, lo anterior podría (y debería) simplemente puede escribir como sigue:

NSLog(@"%@", entered); 

Naturaleza de exploits de seguridad

Cadena de formato no controlado [1] es un tipo de vulnerabilidad de software, descubierto alrededor de 1999, que se puede usar en exploits de seguridad. Habilidades de cadena de formato previamente inofensivas, se pueden utilizar para bloquear un programa o para ejecutar código dañino. El problema se deriva del uso de la entrada del usuario sin marcar como el parámetro de cadena de formato en ciertas funciones C que realizan el formateo, como printf(). Un usuario malicioso puede usar los tokens de formato %s y %x, entre otros, para imprimir los datos de la pila o posiblemente en otras ubicaciones de la memoria. También se puede escribir datos arbitrarios en ubicaciones arbitrarias usando el token de formato %n, que ordena printf() y funciones similares para escribir el número de bytes formateados en una dirección almacenada en la pila.

Un típico exploit utiliza una combinación de estas técnicas para forzar un programa para sobrescribir la dirección de una función de biblioteca o la dirección de retorno en la pila con un puntero a algún código shell maliciosos.Los parámetros de relleno a los especificadores de formato se utilizan para controlar el número de bytes de salida y el token %x se utiliza para extraer bytes de la pila hasta que se alcanza el de la cadena de formato en sí. El inicio de la cadena de formato está diseñado para contener la dirección que el token de formato %n puede entonces sobrescribir con la dirección del código malicioso para ejecutar.

Fuente: Wikipedia Uncontrolled Format String

[1]: http://cwe.mitre.org/data/definitions/134.html "CWE-134: Formato no controlada de cuerda". Enumeración de debilidad común. INGLETE.

+2

¿Podría mostrar cómo funciona este exploit "conocido"? –

+0

+1 de ** Naturaleza de las vulnerabilidades de seguridad ** –

+0

+1 de cómo evita esta solución "el uso de la entrada del usuario no revisada como el parámetro de cadena de formato en ciertas funciones C que realizan el formateo" –

2

Probar:

NSLog(@"%@",[NSString stringWithFormat:@"%@",entered]); 

la esperanza que esto le ayuda. :)

Cuestiones relacionadas