【问题标题】:What are the security implications of using boost/format?使用 boost/format 的安全隐患是什么?
【发布时间】:2010-10-22 07:43:02
【问题描述】:

我开始使用 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 时会出现安全问题?

【问题讨论】:

    标签: c++ security boost format


    【解决方案1】:

    你的例子是安全的。事实上,使用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,当参数个数不符合格式字符串时会抛出异常。广告 (3),这个问题解决了,因为 operator% 的参数是在编译时检查的。

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

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

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

    【讨论】:

      【解决方案2】:

      如果您的意思是 printf 等效项的安全性,类型说明符不正确或可能的缓冲区溢出,那么 boost/format 非常好——我认为即使使用用户提供的格式字符串。但是您必须记住,它可能会引发异常。查看文档以了解何时以及抛出哪些异常。

      【讨论】:

        猜你喜欢
        • 2020-01-27
        • 1970-01-01
        • 2010-09-07
        • 1970-01-01
        • 2012-07-13
        • 2023-01-30
        • 2015-01-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多