使用boost / format有什么安全隐患?

时间:2010-10-22 07:43:02

标签: c++ security boost format

我开始使用boost / format。

使用boost / format进行编码时,我应该注意哪些安全性?

我可以在不担心安全性的情况下执行以下操作吗?

std::cout << boost::format("Hello %2%! Do you want to %1%?") 
    % user_supplied_str1 % user_supplied_str2 << std::endl;

在使用boost / format时,安全性会出现问题的情况是什么?

2 个答案:

答案 0 :(得分:3)

你的榜样是安全的。事实上,printf是安全的。与printf一样,Boost.Format只解析其格式字符串一次,因此没有机会插入额外的格式说明符。将不完整的format对象传递给boost::format会引发异常。

我猜你害怕的是format string exploits。我认为,使用Boost.Format是不可能的。 printf总结了%n易受攻击的原因:

  1. varargs允许写入任意内存位置。
  2. varargs不允许参数计数,因此字符串可以打印出整个堆。
  3. %n不是类型安全的。
  4. 广告(1),varargs来自Boost.Format的Cowan et al.“因为它不适合这种情况。” Ad(2),Boost.Format不使用operator%并在参数数量不符合格式字符串时抛出异常。 Ad(3),这是因为在编译时检查sprintf的参数。

    (我只是试图让Boost.Format使用自定义格式字符串在内存中打印C字符串的地址,它不会让我。)

    此外,避免了{{1}}中的缓冲区溢出,因为字符串是动态分配的。

    如果您想要安全起见,请不要使用来自不受信任来源的格式字符串。

答案 1 :(得分:1)

如果你的意思是printf等价物的安全性与不正确的类型说明符或可能的缓冲区溢出,那么boost / format非常好 - 即使用户提供的格式字符串,我想。但你必须记住,它可能会抛出异常。查看有关何时以及引发异常的文档。