问题与代码:格式string不是一个string文字

可能重复:
SnowLeopard Xcode警告:“格式不是string文字和格式参数”

我为这行代码得到以下问题。

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

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

有什么build议么?

编译器希望我们对格式化string( NSLog的第一个参数)使用一个NSString常量,因为它阻止了一个相当有名的漏洞,可能会违反安全性。 例如,你可以改变你发布的代码,如下所示,以保持编译器的快乐:

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

编辑

当然,以上可以(也应该)写成如下:

 NSLog(@"%@", entered); 

安全漏洞的性质

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

典型的漏洞利用这些技术的组合来强制程序用一个指向某个恶意shellcode的指针来覆盖栈函数的地址或堆栈上的返回地址。 格式说明符的填充参数用于控制输出的字节数, %x令牌用于从堆栈中popup字节,直到达到格式string本身的开始。 格式化string的开始是为了包含%n格式标记可以用要执行的恶意代码的地址覆盖的地址。

来源:维基百科Uncontrolled格式string

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

这是解决scheme。

警告:“格式不是string文字和格式参数”

尝试

 NSLog(@"%@",entered); 

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

尝试:

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

希望这可以帮助你。 🙂