2010-10-22 53 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的當量不正確類型說明符或可能的緩衝區溢出而言意味着安全,然後提升/格式是完全沒有問題 - 甚至與用戶提供的格式字符串,我想。但是你必須記住它可能會拋出異常。檢查有關什麼時候拋出異常的文檔。