代码问题:格式字符串不是字符串文字

时间:2011-03-25 03:45:56

标签: iphone objective-c

  

可能重复:
  SnowLeopard Xcode warning: “format not a string literal and no format arguments”

我在这行代码中遇到以下问题。

“格式字符串不是字符串文字(可能不安全)”

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

有什么建议吗?

3 个答案:

答案 0 :(得分:138)

编译器希望我们对格式字符串(NSLog的第一个参数)使用NSString常量,因为它可以防止可能违反安全性的相当知名的漏洞。因此,例如,您可以按如下方式更改发布的代码,以使编译器满意:

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

修改

当然,上述内容可以(而且应该)简单地写成如下:

NSLog(@"%@", entered);

安全漏洞的性质

  

不受控制的格式字符串 [1]是一种软件漏洞,   在1999年左右发现,可用于安全漏洞。   以前认为无害的格式字符串漏洞可用于   崩溃程序或执行有害代码。问题源于   使用未经检查的用户输入作为格式字符串参数   执行格式化的C函数,例如printf()。恶意的   用户可以使用%s%x格式标记来打印数据   从堆栈或可能在内存中的其他位置。也可以   使用%n格式令牌将任意数据写入任意位置,   其中命令printf()和类似函数写入的数量   格式化为存储在堆栈中的地址的字节。

     

典型的漏洞利用   使用这些技术的组合来强制程序覆盖   库函数的地址或堆栈上的返回地址   用指针指向某些恶意shellcode。填充参数为   格式说明符用于控制输出的字节数和   %x令牌用于从堆栈中弹出字节直到开头   到达格式字符串本身。格式字符串的开头   精心设计,以包含%n格式令牌可以的地址   用要执行的恶意代码的地址覆盖。

来源:维基百科Uncontrolled Format String

[1]:http://cwe.mitre.org/data/definitions/134.html“CWE-134:不受控制的格式字符串”。常见的弱点列举。迈特。

答案 1 :(得分:31)

这是解决方案。

Warning: "format not a string literal and no format arguments"

尝试

NSLog(@"%@",entered);

因为NSLog也可以为你做格式化...

答案 2 :(得分:2)

<强>尝试:

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

希望这会对你有所帮助。 :)