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

aug*_*tin 5 c++ security format boost

我开始使用boost/format.

使用boost/format进行编码时,在安全性方面我应该注意什么?

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

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

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

Fre*_*Foo 3

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

我猜你担心的是格式字符串漏洞。我认为使用 Boost.Format 是不可能实现的。Cowan等人printf总结了脆弱的原因。:

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

Ad (1)%n已从Boost.Format 中省略,“因为它不适合此上下文”。varargsAd (2),当参数数量不符合格式字符串时,Boost.Format 不使用并抛出异常。Ad (3),这个问题已经解决,因为 的参数是operator%在编译时检查的。

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

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

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