我开始使用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时,安全性会出现问题的情况是什么?
答案 0 :(得分:3)
你的榜样是安全的。事实上,printf
是安全的。与printf
一样,Boost.Format只解析其格式字符串一次,因此没有机会插入额外的格式说明符。将不完整的format
对象传递给boost::format
会引发异常。
我猜你害怕的是format string exploits。我认为,使用Boost.Format是不可能的。 printf
总结了%n
易受攻击的原因:
varargs
允许写入任意内存位置。varargs
不允许参数计数,因此字符串可以打印出整个堆。%n
不是类型安全的。广告(1),varargs
来自Boost.Format的Cowan et al.“因为它不适合这种情况。” Ad(2),Boost.Format不使用operator%
并在参数数量不符合格式字符串时抛出异常。 Ad(3),这是因为在编译时检查sprintf
的参数。
(我只是试图让Boost.Format使用自定义格式字符串在内存中打印C字符串的地址,它不会让我。)
此外,避免了{{1}}中的缓冲区溢出,因为字符串是动态分配的。
如果您想要安全起见,请不要使用来自不受信任来源的格式字符串。
答案 1 :(得分:1)
如果你的意思是printf等价物的安全性与不正确的类型说明符或可能的缓冲区溢出,那么boost / format非常好 - 即使用户提供的格式字符串,我想。但你必须记住,它可能会抛出异常。查看有关何时以及引发异常的文档。