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

53 iphone objective-c

可能重复:
SnowLeopard Xcode警告:"格式不是字符串文字,没有格式参数"

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

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

NSLog([NSString stringWithFormat:@"%@", entered]);
Run Code Online (Sandbox Code Playgroud)

有什么建议?

jle*_*ehr 139

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

NSLog(@"%@", [NSString stringWithFormat:@"%@", entered]);
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

安全漏洞的性质

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

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

来源:维基百科不受控制的格式字符串

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

  • 你能说明这个"众所周知"的漏洞利用是如何运作的吗? (2认同)

Jha*_*iya 31

这是解决方案.

警告:"格式不是字符串文字,没有格式参数"

试试吧

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

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

  • 这是一个比被接受的答案更好的答案.没有必要使用stringWithFormat:当NSLog()已经使用了格式! (2认同)