我正在初始化一个可变字符串,然后按如下方式记录它.
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对象设置为%@". %@表示下一个参数是一个对象,并%@用对象的描述(在这种情况下是字符串的值)替换.
如果mStr被设置为类似的东西%@,NSLog会尝试加载一个对象参数,失败,并可能崩溃严重.还有其他格式字符串也可能导致破坏.
如果您只需要记录没有任何标记文本的字符串,请使用:
NSLog(@"%@", mStr);
Run Code Online (Sandbox Code Playgroud)
在mStr你传递将用于格式化.如果此字符串来自不受信任的源,则可以在攻击者提供正确写入的某些输入时使用它来利用您的程序.
您应该将代码修改为:
NSLog(@"%@", (NSString *) mStr);
Run Code Online (Sandbox Code Playgroud)
这样,无论存储什么内容mStr,攻击者都不能利用它来利用您的程序.
这是一个严重的安全问题; 从我在CVE数据库的本地存档中,我计算了1999年到2012年初之间的520个格式字符串漏洞实例.
| 归档时间: |
|
| 查看次数: |
3448 次 |
| 最近记录: |