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:
%n
ermöglicht, beliebige Speicherplatz zu schreiben.
varargs
erlaubt keine Argumentzählung, daher kann eine Zeichenfolge den gesamten Heap ausgeben.
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.