2010-10-22 52 views
5

我开始使用boost /格式。使用boost /格式的安全含义是什么?

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

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

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

在使用boost /格式时安全性会成为问题的情况是什么?

回答

3

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

我猜你害怕的是format string exploits。我认为,使用Boost.Format是不可能的。为什么printf是脆弱的原因是由Cowan et al.总结:

  1. %n允许写入到任意的内存地址。
  2. varargs不允许参数计数,所以一个字符串可以打印出整个堆。
  3. varargs不是类型安全的。

广告(1),%n已经从Boost.Format库omitted “因为它并没有在这方面适合。”广告(2),Boost.Format库不使用varargs并抛出时参数的数量不符合格式字符串异常。 Ad(3),这是因为在编译时检查operator%的参数。

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

此外,在sprintf缓冲区溢出是避免因为字符串是动态分配的。

如果你想成为安全起见,不要使用不明来源的格式字符串。

1

如果你在printf的当量不正确类型说明符或可能的缓冲区溢出而言意味着安全,然后提升/格式是完全没有问题 - 甚至与用户提供的格式字符串,我想。但是你必须记住它可能会抛出异常。检查有关什么时候抛出异常的文档。