Каковы последствия безопасности при использовании boost / format? - PullRequest
5 голосов
/ 22 октября 2010

Я начинаю использовать 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?

Ответы [ 2 ]

3 голосов
/ 22 октября 2010

Ваш пример в безопасности. На самом деле, это было безопасно с printf. Как и printf, Boost.Format анализирует только одну строку формата, поэтому нет никакой возможности вставить дополнительные спецификаторы формата. Передача неполного format объекта в boost::format вызывает исключение.

Полагаю, вы боитесь форматных строк . Это, я думаю, невозможно с помощью Boost.Format. Причины уязвимости printf обобщены в Cowan и др. :

  1. %n позволяет выполнять запись в произвольные области памяти.
  2. varargs не позволяет считать аргументы, поэтому строка может распечатать всю кучу.
  3. varargs не является типобезопасным.

Объявление (1), %n было опущено в Boost.Format "потому что оно не вписывается в этот контекст". Объявление (2), Boost.Format не использует varargs и выдает исключение, когда количество аргументов не соответствует форматной строке. В Ad (3) это решается, потому что аргументы operator% проверяются во время компиляции.

(Я только что попытался заставить Boost.Format напечатать адрес строки C в памяти, используя строку произвольного формата, и это мне не дало.)

Кроме того, переполнение буфера в sprintf предотвращается, поскольку строки распределяются динамически.

Если вы хотите быть в безопасности, не используйте строки форматирования из ненадежных источников.

1 голос
/ 22 октября 2010

Если вы имеете в виду безопасность в терминах эквивалентов printf с неверными спецификаторами типов или возможными переполнениями буфера, то повышение / форматирование прекрасно, даже, думаю, даже с предоставленной пользователем строкой формата. Но вы должны иметь в виду, что это может вызвать исключение. Проверьте документацию о том, когда и какие исключения генерируются.

...