fmt
Seguridad en fmt: autoridad del formato, vida útil y codificación
Distingue texto no confiable de un programa de formato dinámico y no confundas tipos seguros o escrituras limitadas con seguridad completa de salida.
Qué aprenderás
- Separa los datos de la autoridad de formato
- Audita la frontera asíncrona
- El destino tiene su propio protocolo
Antes de empezar
- Valores, referencias, cadenas y destinos de construcción en C++
- Distinguir expectativas documentadas de resultados medidos
Traza comportamientos concretos de fmt y elige una integración con límites explícitos de salida, vida útil y verificación.
Conclusiones clave
- Texto de usuario y plantillas dinámicas conceden controles distintos.
- Los datos prestados deben sobrevivir al formato diferido.
- La seguridad de tipos no reemplaza límites, codificación ni tratamiento de secretos.
Separa los datos de la autoridad de formato
Cuando el texto del usuario es solo un valor, colócalo detrás de un campo fijo como fmt::format("{}", text). Permitir que proporcione una cadena envuelta en fmt::runtime le concede control sobre campos, presentación y tamaños. Puede ser intencional en un editor de plantillas, pero exige restricciones explícitas y gestión de fallos.
Un error de formato dinámico no es el único riesgo de recursos. Anchuras válidas pero enormes, cadenas grandes y trabajo de formatters propios consumen tiempo o memoria. Limita los valores y las funciones de plantilla antes de formatear. format_to_n restringe escrituras en el destino; su cómputo completo no establece un presupuesto total de ejecución.
Audita la frontera asíncrona
La API de vistas no posee los objetos referenciados. Una cola que almacena fmt::format_args para usarlo después puede sobrevivir al almacén de argumentos o a las cadenas. El almacenamiento dinámico copia ciertos tipos, pero las vistas y referencias explícitas siguen tomando prestados sus datos. Un nombre de contenedor cómodo no sustituye una auditoría de propiedad.
Un contraejemplo basado en el código inserta una matriz como copia, referencia y vista, y después modifica su primer carácter. La copia sigue produciendo abc, mientras las formas prestadas producen Xbc. La lección no es prohibir referencias: el propietario y la vida útil deben formar parte del contrato de la cola.
El destino tiene su propio protocolo
fmt produce texto formateado; no es un sanitizador HTML, un enlace de parámetros SQL ni una política de ocultación de secretos. Una presentación de depuración puede facilitar la lectura sin cumplir las reglas de escape de otro contexto. Decide qué datos pueden salir y aplica después la codificación o API estructurada adecuada para el destino.
En búferes fijos, conserva la longitud escrita y decide cómo indicar truncamiento. Los prefijos UTF-8 incompletos y la falta de terminador requieren tratamiento propio. Las pruebas y referencias a fuzzing upstream aportan evidencia de calidad, pero esta revisión editorial no es una auditoría completa ni una garantía para tu formatter y configuración.
Pasos de implementación
- 1
Mantén el texto ordinario detrás de un formato literal fijo.
- 2
Restringe tamaño y funciones cuando las plantillas sean necesarias.
- 3
Revisa propiedad entre colas y callbacks.
- 4
Aplica reglas del destino y manejo explícito de truncamiento.
Ejemplo para copiar
#include <fmt/args.h>
#include <cassert>
#include <functional>
int main() {
char text[] = "abc";
fmt::dynamic_format_arg_store<fmt::format_context> store;
store.push_back(text);
store.push_back(std::cref(text));
store.push_back(fmt::string_view(text));
text[0] = 'X';
assert(fmt::vformat("{}|{}|{}", store) == "abc|Xbc|Xbc");
}Preguntas frecuentes
¿fmt hace que el HTML generado sea seguro automáticamente?
No. Formato y escape contextual son responsabilidades diferentes; utiliza una frontera apropiada de codificación o plantillas HTML.
¿Un almacén dinámico posee por completo un registro asíncrono?
No automáticamente. Revisa vistas, referencias y requisitos de tipos propios antes de aplazar la operación.
Fuentes
- doc/api.mdFuente verificada 2026-09-08
- doc/syntax.mdFuente verificada 2026-09-08
- include/fmt/core.hFuente verificada 2026-09-08
- include/fmt/args.hFuente verificada 2026-09-08
- test/format-test.ccFuente verificada 2026-09-08
- test/args-test.ccFuente verificada 2026-09-08