问题与代码:格式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]);
希望这可以帮助你。 🙂