53 votes

Problème Avec le Code: Format de chaîne de caractères n'est pas une chaîne littérale

Double Possible:
SnowLeopard Xcode avertissement: “le format n'est pas une chaîne littérale et pas de format arguments”

Je reçois le problème suivant cette ligne de code.

"Chaîne de Format n'est pas une chaîne littérale (potentiellement dangereux)"

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

Toutes les suggestions?

139voto

jlehr Points 9809

Le compilateur veut que nous utilisions un NSString constante pour la chaîne de format (le premier argument NSLog) parce qu'elle empêche un assez connu exploiter qui pourraient enfreindre la sécurité. Ainsi, par exemple, vous pouvez changer le code que vous avez posté comme suit pour garder le bonheur du compilateur:

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

MODIFIER

Et bien sûr, le ci-dessus pourrait (et devrait) être simplement écrit comme suit:

NSLog(@"%@", entered);

La Nature des failles de Sécurité

Incontrôlée de la chaîne de format[1] est un type de vulnérabilité de logiciel, découvert en 1999 environ, qui peut être utilisé dans des failles de sécurité. Déjà pensé à couvert, chaîne de format exploits peuvent être utilisés pour crash d'un programme ou d'exécuter du code dangereux. Le problème vient de la l'utilisation incontrôlée de l'utilisateur d'entrée que le format de la chaîne de paramètre dans certains C fonctions effectuer la mise en forme, telles que l' printf(). Un malveillant l'utilisateur peut utiliser l' %s et %x format jetons, entre autres, d'imprimer les données à partir de la pile ou peut-être d'autres emplacements dans la mémoire. On peut aussi écrire des données arbitraires à des emplacements arbitraires à l'aide de l' %n format jeton, les commandes printf() et des fonctions similaires à écrire le nombre de octets formaté à une adresse stockée dans la pile.

Typique de l'exploiter utilise une combinaison de ces techniques pour forcer un programme à remplacer l'adresse d'une fonction de la bibliothèque ou de l'adresse de retour sur la pile avec un pointeur vers malveillant shellcode. Le rembourrage des paramètres à les spécificateurs de format sont utilisées pour contrôler le nombre d'octets de sortie et l' %x jeton est utilisé pour pop octets de la pile jusqu'à ce que le début de la chaîne de format en lui-même est atteint. Le début de la chaîne de format est conçu pour contenir l'adresse de l' %n format jeton peut alors remplacer par l'adresse de la malveillant d'exécuter du code.

Source: Wikipedia Incontrôlée De La Chaîne De Format

[1]: http://cwe.mitre.org/data/definitions/134.html "CWE-134: Incontrôlée de la" Chaîne de Format. Commune De La Faiblesse De L'Énumération. MITRE.

31voto

Jhaliya Points 24039

Voici la solution.

SnowLeopard Xcode avertissement: "le format n'est pas une chaîne littérale et pas de format arguments"

Essayez avec

NSLog(@"%@",entered);

parce que NSLog peut aussi faire de la mise en forme pour vous...

2voto

Parth Bhatt Points 10508

Essayez:

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

Espérons que cela vous aide. :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X