Почему моя строка потенциально небезопасна в моем приложении iOS? - PullRequest
8 голосов
/ 01 апреля 2012

Я инициализирую изменяемую строку и затем регистрирую ее следующим образом.

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

Код работает и работает, но я получаю странное предупреждение (желтым цветом):

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

Почему?

Ответы [ 3 ]

10 голосов
/ 01 апреля 2012

Ну, здесь есть несколько проблем.

Первый (а не тот, о котором вы спрашивали) заключается в том, что вы выделяете новую NSMutableString, а затем просто выбрасываете ее во второй строке, когда устанавливаете его в someTextFieldIbOutlet.text. Кроме того, вы приводите неизменяемую строку к изменяемой, которая на самом деле не будет работать. Вместо этого объедините первые две строки следующим образом:

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

Фактическая ошибка, которую вы получаете, вызвана тем, что первым аргументом NSLog считается строка «format», которая сообщает NSLog, как вы хотите отформатировать данные, которые следуют в последующих аргументах. Это должна быть буквальная строка (созданная как @"this is a literal string"), чтобы ее нельзя было использовать для использования вашей программы путем внесения в нее изменений.

Вместо этого используйте это:

NSLog(@"%@", mStr );

В этом случае строка формата - @"%@", что означает «Создать объект NSString, установленный на %@». %@ означает, что следующим аргументом является объект, и заменить %@ описанием объекта (которое в данном случае является значением строки).

6 голосов
/ 01 апреля 2012

Передаваемый mStr используется для форматирования.Если эта строка поступает из ненадежного источника, ее можно использовать для использования вашей программы , если злоумышленник предоставит некоторые данные, которые правильно написаны.

Вам следует изменить код на:

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

Таким образом, независимо от того, какой контент хранится в mStr, злоумышленник не может использовать его для использования вашей программы.

Это серьезная проблема безопасности;из моего локального архива базы данных CVE я насчитал 520 случаев уязвимости форматной строки в период с 1999 по начало 2012 года.

6 голосов
/ 01 апреля 2012

Если бы mStr было установлено на что-то вроде %@, NSLog попытался бы загрузить аргумент объекта, потерпеть неудачу и, вероятно, потерпеть неудачу. Существуют строки других форматов, которые также могут вызвать хаос.

Если вам нужно просто записать строку без текста маркера, используйте:

NSLog(@"%@", mStr);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...