2010-10-22 15 views
5

Zaczynam używać boost/format.Jakie są implikacje związane z bezpieczeństwem używania funkcji zwiększania/formatowania?

Kiedy powinienem zwracać uwagę na bezpieczeństwo?

Czy mogę wykonać następujące czynności bez obawy o bezpieczeństwo?

std::cout << boost::format("Hello %2%! Do you want to %1%?") 
    % user_supplied_str1 % user_supplied_str2 << std::endl; 

Jakie są sytuacje, w których bezpieczeństwo może stanowić problem przy korzystaniu z boost/format?

Odpowiedz

3

Twój przykład jest bezpieczny. W rzeczywistości był bezpieczny z printf. Podobnie jak printf, Boost.Format analizuje tylko jeden ciąg formatu, więc nie ma możliwości wstawienia dodatkowych specyfikatorów formatu. Przekazanie niekompletnego obiektu format do boost::format powoduje zgłoszenie wyjątku.

Domyślam się, czego się boisz, to format string exploits. Są to, moim zdaniem, niemożliwe przy użyciu Boost.Format. Powody printf jest podatne są zestawione przez Cowan et al.:

  1. %n pozwala na zapisywanie do dowolnych miejscach pamięci.
  2. varargs nie pozwala na zliczanie argumentów, więc ciąg znaków może wydrukować całą stertę.
  3. varargs nie jest bezpieczny w użyciu.

Ad (1), %n został omitted z Boost.Format ", ponieważ nie pasuje w tym kontekście." Ad (2), Boost.Format nie używa varargs i zgłasza wyjątek, gdy liczba argumentów nie pasuje do ciągu formatującego. Ad (3), jest to rozwiązane, ponieważ argumenty do operator% są sprawdzane podczas kompilacji.

(ja po prostu starał się Boost.Format wydrukować adres ciąg C w pamięci przy użyciu własnego formatu, a to nie pozwoli mi.)

Ponadto, przepełnienie bufora w sprintf jest uniknięto, ponieważ łańcuchy są przydzielane dynamicznie.

Jeśli chcesz być po bezpiecznej stronie, nie używaj ciągów formatów z niezaufanych źródeł.

1

Jeśli masz na myśli bezpieczeństwo w odniesieniu do odpowiedników printf z niepoprawnymi specyfikatorami lub możliwymi przepełnieniami bufora, to boost/format jest idealnie w porządku - nawet z użyciem ciągu znaków dostarczonego przez użytkownika. Ale musisz pamiętać, że może on rzucić wyjątek. Sprawdź dokumentację o tym, kiedy i jakie wyjątki są zgłaszane.

Powiązane problemy