【问题标题】:Is snprintf or vsnprintf better, and how can I ensure I'm using them securely?snprintf 或 vsnprintf 更好,我如何确保安全地使用它们?
【发布时间】:2012-09-02 19:02:37
【问题描述】:

我决定在一些旧代码上运行一个静态分析工具,我发现了很多我正在使用 sprintf 的地方。该工具建议使用 vsnprintf 或 snprintf 替换调用,因为 sprintf 不会对缓冲区溢出进行任何类型的边界检查。

我可以轻松地对调用进行查找和替换,以便它使用 snprintf 或 vsnprintf,但我想确保不需要做任何其他事情来确保功能安全

在某些情况下,所使用的字符串源自用户输入,而在某些情况下则不是。

有人对如何正确地做这件事有任何建议吗?

【问题讨论】:

  • "是 snprintf 还是 vsnprintf 更好" 这取决于您是否有可变参数或 va_list
  • 不担心便携性,不。
  • 需要注意的是,C11 引入了(甚至)更安全的sprintf_ssnprintf_svsnprintf_s。但是,它们是可选的。

标签: c printf buffer-overflow


【解决方案1】:

我可以轻松地对调用进行查找和替换,以便它使用 snprintf 或 vsnprintf

不,没那么容易。只需查看snprintfvsnprintf 的定义,您就会发现它们采用了一个名为size 的额外参数,用于指定输出缓冲区的长度。这就是函数名中的n 的含义。为了使您的代码安全,您必须查看执行 sprintf 的每个地方,找出可以安全写入输出缓冲区的最大字节数,并将该数字作为 size 参数传递给 @987654326 @ 或vsnprintf

不安全的代码:

char buffer[10];
sprintf(buffer, "%d %d", x, y);  // UNSAFE if x and y can be large

等效安全码:

char buffer[10];
snprintf(buffer, sizeof(buffer), "%d %d", x, y);

也许如果您的所有代码都符合上述示例,那么您可以进行搜索和替换。但是对于更复杂的情况,您可能不得不考虑它。

【讨论】:

  • buffer 是指针而不是数组时,搜索和替换将无法做正确的事情,但除非您使用的缓冲区小于指针的大小(通常为 4或 8 个字节),这只会导致您的输出被过度截断而不是允许溢出。并且希望这样的截断错误会在您运行测试时立即显现出来。
猜你喜欢
  • 1970-01-01
  • 2018-07-28
  • 2011-11-11
  • 2010-09-25
  • 2022-01-12
  • 2020-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多