2010-10-22 11 views
5

Estoy empezando a utilizar boost/format.¿Cuáles son las implicaciones de seguridad de usar boost/format?

Al codificar con impulso/formato, ¿a qué debo prestarle atención con respecto a la seguridad?

¿Puedo hacer lo siguiente sin preocuparme por la seguridad?

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

¿Cuáles son las situaciones en las que la seguridad podría ser un problema al usar boost/format?

Respuesta

3

Su ejemplo es seguro. De hecho, era seguro con printf. Al igual que printf, Boost.Format solo analiza su cadena de formato una vez, por lo que no hay posibilidad de insertar especificadores de formato adicionales. Pasar un objeto format incompleto a boost::format arroja una excepción.

Supongo que lo que le teme es format string exploits. Esos, creo, imposibles usando Boost.Format. Las razones por las printf es vulnerable son resumidos por Cowan et al.:

  1. %n permite la escritura a las posiciones de memoria arbitrarias.
  2. varargs no permite el recuento de argumentos, por lo que una cadena puede imprimir todo el montón.
  3. varargs no es seguro.

anuncio (1), %n ha sido omitted de Boost.Format "porque no encaja en este contexto". Ad (2), Boost.Format no usa varargs y arroja una excepción cuando el número de argumentos no se ajusta a la cadena de formato. Ad (3), esto se resuelve porque los argumentos a operator% se comprueban en tiempo de compilación.

(Sólo traté de conseguir Boost.Format para imprimir la dirección de una cadena C en la memoria utilizando una cadena de formato personalizado, y no me deja.)

Además, el desbordamiento de búfer en sprintf es evitado porque las cadenas se asignan dinámicamente.

Si quiere estar seguro, no use cadenas de formato de fuentes que no sean de confianza.

1

Si se refiere a la seguridad en términos de equivalentes de printf con especificadores de tipo incorrectos o posibles desbordamientos de búfer, entonces el refuerzo/formato está perfectamente bien, incluso con una cadena de formato proporcionada por el usuario, creo. Pero debes tener en cuenta que podría arrojar una excepción. Consulte la documentación sobre cuándo y qué excepciones se lanzan.

Cuestiones relacionadas