为什么我的字符串在我的iOS应用程序中可能不安全?

Jus*_*and 8 objective-c ios

我正在初始化一个可变字符串,然后按如下方式记录它.

NSMutableString* mStr = [[NSMutableString alloc] init];
mStr = (NSMutableString*) someTextFieldIbOutlet.text;
NSLog((NSString *) mStr);
Run Code Online (Sandbox Code Playgroud)

代码工作并运行,但我收到一个奇怪的警告(黄色):

Format string is not a string literal (potentially insecure).
Run Code Online (Sandbox Code Playgroud)

为什么?

lna*_*ger 10

嗯,这里有一些问题.

第一个(而不是你问的)是,当你将它设置为someTextFieldIbOutlet.text您分配一个新的NSMutableString,然后简单地把它扔在第二行.此外,您正在将一个不可变的字符串转换为可变的字符串,该字符串实际上不起作用.相反,将前两行组合如下:

NSMutableString* mStr = [NSMutableString stringWithString:someTextFieldIbOutlet.text];
Run Code Online (Sandbox Code Playgroud)

您获得的实际错误是由于NSLog的第一个参数应该是"格式"字符串,该字符串告诉NSLog您希望如何格式化后面参数中的数据.这应该是一个文字字符串(创建类似@"this is a literal string"),以便它不能用于通过对其进行更改来利用您的程序.

相反,使用这个:

NSLog(@"%@", mStr );
Run Code Online (Sandbox Code Playgroud)

在这种情况下,格式字符串@"%@"表示"创建NSString对象设置为%@". %@表示下一个参数是一个对象,并%@用对象的描述(在这种情况下是字符串的值)替换.


dus*_*uff 6

如果mStr被设置为类似的东西%@,NSLog会尝试加载一个对象参数,失败,并可能崩溃严重.还有其他格式字符串也可能导致破坏.

如果您只需要记录没有任何标记文本的字符串,请使用:

NSLog(@"%@", mStr);
Run Code Online (Sandbox Code Playgroud)


sar*_*old 6

mStr你传递将用于格式化.如果此字符串来自不受信任的源,则可以在攻击者提供正确写入的某些输入时使用它来利用您的程序.

您应该将代码修改为:

NSLog(@"%@", (NSString *) mStr);
Run Code Online (Sandbox Code Playgroud)

这样,无论存储什么内容mStr,攻击者都不能利用它来利用您的程序.

这是一个严重的安全问题; 从我在CVE数据库的本地存档中,我计算了1999年到2012年初之间的520个格式字符串漏洞实例.