2010-10-22 9 views
5

Ich fange an, Boost/Format zu verwenden.Welche Auswirkungen hat die Verwendung von Boost/Format auf die Sicherheit?

Bei der Codierung mit Boost/Format, was muss ich im Hinblick auf die Sicherheit beachten?

Kann ich Folgendes tun, ohne mich um die Sicherheit zu kümmern?

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

In welchen Situationen würde Sicherheit bei der Verwendung von Boost/Format ein Problem darstellen?

Antwort

3

Ihr Beispiel ist sicher. In der Tat war es sicher mit printf. Wie bei printf analysiert Boost.Format seine Formatzeichenfolge nur einmal, so dass keine zusätzlichen Formatbezeichner eingefügt werden können. Das Übergeben eines unvollständigen Objekts format an boost::format löst eine Ausnahme aus.

Ich denke, was Sie haben Angst sind format string exploits. Das ist Boost.Format unmöglich. Die Gründe, warum printf verwundbar sind durch Cowan et al. zusammengefasst:

  1. %n ermöglicht, beliebige Speicherplatz zu schreiben.
  2. varargs erlaubt keine Argumentzählung, daher kann eine Zeichenfolge den gesamten Heap ausgeben.
  3. varargs ist nicht typsicher.

Ad (1), %n wurde omitted von Boost.Format "weil es in diesem Zusammenhang nicht passt." Ad (2), Boost.Format verwendet varargs nicht und löst eine Ausnahme aus, wenn die Anzahl der Argumente nicht in die Formatzeichenfolge passt. Ad (3), das ist gelöst, weil die Argumente zu operator% zur Kompilierzeit überprüft werden.

(Ich habe gerade versucht Boost.Format zu bekommen die Adresse eines C-String im Speicher zu drucken, ein benutzerdefiniertes Format-String verwendet wird, und es lässt mich nicht.)

Ferner wird der Pufferüberlauf in sprintf ist vermieden, da Strings dynamisch zugewiesen werden.

Wenn Sie auf der sicheren Seite sein wollen, verwenden Sie keine Formatzeichenfolgen aus nicht vertrauenswürdigen Quellen.

1

Wenn Sie Sicherheit in Bezug auf Printf-Äquivalente mit falschen Typbezeichnern oder möglichen Pufferüberläufen meinen, dann ist boost/format völlig in Ordnung - sogar mit einer vom Benutzer gelieferten Formatzeichenfolge, denke ich. Aber Sie müssen daran denken, dass es eine Ausnahme auslösen könnte. Sehen Sie in der Dokumentation nach, wann und welche Ausnahmen ausgelöst werden.

Verwandte Themen