使用boost /格式的安全含义是什么?
问题描述:
我开始使用boost /格式。使用boost /格式的安全含义是什么?
使用boost/format进行编码时,我应该注意哪些安全问题?
我可以在不担心安全性的情况下执行以下操作吗?
std::cout << boost::format("Hello %2%! Do you want to %1%?")
% user_supplied_str1 % user_supplied_str2 << std::endl;
在使用boost /格式时安全性会成为问题的情况是什么?
答
你的例子很安全。事实上,这是安全的printf
。像printf
一样,Boost.Format仅解析其格式字符串一次,因此没有机会插入额外的格式说明符。将不完整的format
对象传递给boost::format
会引发异常。
我猜你害怕的是format string exploits。我认为,使用Boost.Format是不可能的。为什么printf
是脆弱的原因是由Cowan et al.总结:
-
%n
允许写入到任意的内存地址。 -
varargs
不允许参数计数,所以一个字符串可以打印出整个堆。 -
varargs
不是类型安全的。
广告(1),%n
已经从Boost.Format库omitted “因为它并没有在这方面适合。”广告(2),Boost.Format库不使用varargs
并抛出时参数的数量不符合格式字符串异常。 Ad(3),这是因为在编译时检查operator%
的参数。
(我只是试图让Boost.Format库使用自定义格式字符串来打印一个C字符串的地址在内存中,它不会让我。)
此外,在sprintf
缓冲区溢出是避免因为字符串是动态分配的。
如果你想成为安全起见,不要使用不明来源的格式字符串。
答
如果你在printf的当量不正确类型说明符或可能的缓冲区溢出而言意味着安全,然后提升/格式是完全没有问题 - 甚至与用户提供的格式字符串,我想。但是你必须记住它可能会抛出异常。检查有关什么时候抛出异常的文档。