Pourquoi ma string est-elle potentiellement non sécurisée dans mon application iOS?

J'initialise une string mutable, puis je l'enregistre comme suit.

NSMutableSsortingng* mStr = [[NSMutableSsortingng alloc] init]; mStr = (NSMutableSsortingng*) someTextFieldIbOutlet.text; NSLog((NSSsortingng *) mStr); 

Le code fonctionne et fonctionne, mais je reçois un avertissement étrange (en jaune):

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

Pourquoi?

Eh bien, il y a quelques problèmes ici.

Le premier (et non celui que vous avez demandé à propos de) est que vous allouer un nouveau NSMutableSsortingng, puis simplement le jeter dans la deuxième ligne lorsque vous le définissez à someTextFieldIbOutlet.text. En outre, vous êtes en train de convertir une string non mutable en une string mutable qui ne fonctionnera pas réellement. Au lieu de cela, combinez les deux premières lignes comme ceci:

 NSMutableSsortingng* mStr = [NSMutableSsortingng ssortingngWithSsortingng:someTextFieldIbOutlet.text]; 

L'erreur réelle que vous obtenez est due au fait que le premier argument de NSLog est supposé être la string "format" qui indique à NSLog comment vous voulez formater datatables qui suivent dans les arguments suivants. Cela devrait être une string littérale (créée comme @"this is a literal ssortingng" ) afin qu'elle ne puisse pas être utilisée pour exploiter votre programme en y apportant des modifications.

Au lieu de cela, utilisez ceci:

 NSLog(@"%@", mStr ); 

Dans ce cas, la string de format est @"%@" ce qui signifie "Créer un set d'objects NSSsortingng à %@ ". %@ signifie que l'argument suivant est un object et remplace %@ par la description de l'object (qui dans ce cas est la valeur de la string).

Si mStr était défini sur quelque chose comme %@ , NSLog essaierait de charger un argument d'object, échouerait, et NSLog probablement mal. Il existe d'autres strings de format qui peuvent également causer des ravages.

Si vous devez simplement save une string sans text de marqueur, utilisez:

 NSLog(@"%@", mStr); 

Le mStr vous mStr est utilisé pour le formatting. Si cette string provient d'une source non fiable, elle peut être utilisée pour exploiter votre programme si un attaquant fournit une input correctement écrite.

Vous devriez modifier votre code pour:

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

De cette façon, quel que soit le contenu stocké dans mStr , il ne peut pas être utilisé par un attaquant pour exploiter votre programme.

C'est un problème de security sérieux; À partir de mes archives locales de la database CVE , j'ai compté 520 cas de failles de formatting entre 1999 et début 2012.