Question Problème avec le code: la chaîne de format n'est pas une chaîne littérale [dupliquer]


Duplication possible:
Avertissement de SnowLeopard Xcode: "formate pas un littéral de chaîne et pas d'arguments de format" 

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

"La chaîne de format n'est pas un littéral de chaîne (potentiellement non sécurisé)"

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

Aucune suggestion?


53
2018-03-25 03:45


origine


Réponses:


Le compilateur veut que nous utilisions une constante NSString pour la chaîne de format (le premier argument de NSLog) car il empêche un exploit assez connu qui pourrait potentiellement violer la sécurité. Ainsi, par exemple, vous pouvez modifier le code que vous avez publié pour que le compilateur reste heureux:

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

MODIFIER

Et bien sûr, ce qui précède pourrait (et devrait) être simplement écrit comme suit:

NSLog(@"%@", entered);

Nature des exploits de sécurité

Chaîne de format non contrôlée[1] est un type de vulnérabilité logicielle,   découvert vers 1999, qui peut être utilisé dans des exploits de sécurité.   Auparavant considéré comme inoffensif, les exploits de chaîne de format peuvent être utilisés pour   planter un programme ou exécuter du code nuisible. Le problème provient de la   utilisation d’une entrée utilisateur non cochée comme paramètre de chaîne de format dans certains   C fonctions qui effectuent le formatage, telles que printf(). Un malicieux   l'utilisateur peut utiliser le %s et %x format jetons, entre autres, pour imprimer des données   de la pile ou éventuellement d'autres emplacements en mémoire. On peut aussi   écrire des données arbitraires à des endroits arbitraires en utilisant le %n jeton de format,   quelles commandes printf() et fonctions similaires pour écrire le nombre de   octets formatés à une adresse stockée sur la pile.

Un exploit typique   utilise une combinaison de ces techniques pour forcer un programme à écraser   l'adresse d'une fonction de bibliothèque ou l'adresse de retour sur la pile   avec un pointeur vers un shellcode malveillant. Les paramètres de remplissage à   spécificateurs de format sont utilisés pour contrôler le nombre d'octets de sortie et   la %x jeton est utilisé pour faire éclater des octets de la pile jusqu'au début   de la chaîne de format elle-même est atteinte. Le début de la chaîne de format   est conçu pour contenir l'adresse que le %n jeton de format peut alors   écraser avec l'adresse du code malveillant à exécuter.

Source: Wikipedia Chaîne de format non contrôlée

[1]: http://cwe.mitre.org/data/definitions/134.html "CWE-134: Chaîne de format non contrôlée". Dénombrement des Faiblesses Communes. MITRE.


137
2018-03-25 03:51



Voici la solution.

Attention: "formate pas un littéral de chaîne et pas d'arguments de format" 

Essayer avec

NSLog(@"%@",entered);

parce que NSLog peut aussi faire du formatage pour vous ...


31
2018-03-25 03:50



Essayer:

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

J'espère que cela vous aidera. :)


2
2018-03-25 04:45