Ir al contenido

Seguridad y operaciones — NextPDF en CodeIgniter 4

Esta página enumera las amenazas que debe resistir esta integración, documenta los controles presentes en el código fuente del paquete e indica las reglas operativas para un despliegue seguro.

Existen tres superficies en las que puede influir un atacante.

  1. Carga útil del trabajo en cola. La cola almacena los datos del trabajo. Un atacante con acceso al broker puede modificar esos datos. Se trata de entrada deserializada y no confiable.
  2. Nombre de archivo de la respuesta. Un usuario puede proporcionar el nombre del archivo de descarga. Un nombre malicioso puede inyectar contenido en los encabezados.
  3. Rutas de configuración. La ruta de las fuentes y las rutas de firma provienen de la configuración. Una ruta incorrecta puede provocar lecturas o escrituras en una ubicación equivocada.

Control 1 — Lista de permitidos de la carga útil en cola

Sección titulada «Control 1 — Lista de permitidos de la carga útil en cola»

El trabajo en cola trata su carga útil como datos deserializados no confiables. OWASP ASVS exige manejar de forma segura la entrada de datos deserializados no confiables (ASVS V1.5.2).

Controles verificados en GeneratePdfJob:

  • El builder debe ser una cadena no vacía. El trabajo rechaza los demás tipos.
  • El builder debe coincidir con el patrón App\PdfBuilders\<Class>::<method>. El trabajo rechaza cualquier otro espacio de nombres, las funciones simples y las cargas útiles con prefijo o sufijo.
  • El builder debe ser invocable. El trabajo rechaza una cadena que cumple el patrón pero no se puede resolver.

Estas reglas bloquean la ejecución de código arbitrario a través de una carga útil en cola manipulada. Las pruebas del paquete comprueban cada caso de rechazo.

Control 2 — Confinamiento de la ruta de salida en cola

Sección titulada «Control 2 — Confinamiento de la ruta de salida en cola»

El trabajo escribe un archivo en disco. OWASP ASVS exige manejar las rutas de forma segura cuando una aplicación construye rutas de archivo para operaciones con archivos (ASVS V5.3.2).

Controles verificados en GeneratePdfJob:

  • La ruta de salida debe ser una cadena no vacía.
  • El trabajo normaliza la ruta: resuelve los segmentos . y .. y convierte los separadores antes de cualquier comprobación.
  • La ruta normalizada debe quedar dentro de WRITEPATH/pdfs/. El trabajo rechaza cualquier directorio hermano que comparta un prefijo de nombre (pdfs-evil/).
  • La ruta debe terminar en .pdf (sin distinguir mayúsculas de minúsculas).

Estas reglas bloquean la escritura de un archivo arbitrario a través de una carga útil manipulada.

Control 3 — Endurecimiento de los encabezados de la respuesta

Sección titulada «Control 3 — Endurecimiento de los encabezados de la respuesta»

PdfResponse añade un conjunto fijo de encabezados a cada respuesta PDF:

EncabezadoValor
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY
Content-Security-Policydefault-src 'none'
X-Robots-Tagnoindex, nofollow
Referrer-Policyno-referrer
Cache-Controlprivate, max-age=0, must-revalidate

El nombre de archivo se sanea antes de llegar al encabezado. El paquete elimina los separadores de ruta, los bytes nulos y los CR/LF. También se escapan las comillas dobles para la forma entrecomillada. Se agrega un parámetro RFC 5987 filename*=UTF-8''… para un nombre no ASCII. Un nombre vacío se convierte en document.pdf.

Control 4 — Validación de las rutas de configuración

Sección titulada «Control 4 — Validación de las rutas de configuración»

El registro de fuentes rechaza cualquier fontsPath que contenga un stream wrapper (://) o un byte nulo, y genera un error en tiempo de ejecución. Esto bloquea rutas con wrapper como php:// o phar://.

Control 5 — Superficie mínima del localizador de servicios

Sección titulada «Control 5 — Superficie mínima del localizador de servicios»

CodeIgniter 4 no tiene un contenedor PSR-11. En su lugar, usa un localizador de servicios (Services). PSR-11 §1.3 considera desaconsejado el patrón de localizador de servicios (modal SHOULD NOT). El paquete mantiene reducida la superficie del localizador. Cada servicio es un único método de fábrica con nombre. Resolver los servicios en el límite del controlador. Pasar los objetos concretos hacia el interior. No pasar la clase Services al código de dominio.

Operaciones de firma y TSA (NextPDF Pro / Enterprise)

Sección titulada «Operaciones de firma y TSA (NextPDF Pro / Enterprise)»

El servicio de firma está inactivo de forma predeterminada. Solo se activa cuando signature.enabled es true y signature.certificate no está vacío. El nivel de firma predeterminado del paquete es B-B. NextPDF Pro proporciona la firma de línea base B-B. La validación a largo plazo es una capacidad independiente de Enterprise. Se documenta en la referencia Premium, no aquí.

Reglas operativas:

  • Mantener los archivos de certificado y de clave fuera del control de versiones. Proporcionarlos a través de .env o de un gestor de secretos.
  • Mantener tsa.allow_insecure_http establecido en false en producción. Un canal TSA en texto plano no es aceptable.
  • Establecer tsa.pinned_public_keys cuando la TSA publique una clave estable. Mantener tsa.warn_on_key_rotation establecido en true.
  • Restringir el acceso de lectura del archivo de clave al usuario de la aplicación.
  • Fijar todas las versiones resueltas en composer.lock.
  • Requerir codeigniter4/queue en la aplicación que ejecuta los workers.
  • Ejecutar el worker de la cola como un usuario de privilegios reducidos. Concederle acceso de escritura únicamente a WRITEPATH/pdfs/.
  • Proporcionar al worker las mismas extensiones de NextPDF que la capa web. Un PDF firmado necesita NextPDF Pro o Enterprise en el entorno del worker.
  • Confirmar las extensiones mbstring y zlib en cada entorno de ejecución que construya un PDF.
  • Confirmar que los encabezados de la respuesta sobreviven al proxy inverso.
  • Registrar la generación de PDF con contexto. No registrar el material del certificado ni las contraseñas de la clave.
  • El manejo de la carga útil en cola se alinea con OWASP ASVS V1.5.2.
  • El manejo de la ruta de salida en cola se alinea con OWASP ASVS V5.3.2.
  • El diseño del localizador sigue la guía de PSR-11 §1.3.

El núcleo de NextPDF tiene licencia Apache-2.0. Las anclas de confianza de la firma y el endurecimiento de la TSA se aplican cuando está instalado NextPDF Pro o Enterprise. El paquete de CodeIgniter expone los métodos de servicio correspondientes, que devuelven null hasta que se instala el paquete Premium correspondiente. Consultar </get-license/?intent=codeigniter-signing>.

  • /integrations/codeigniter/production-usage/ — registro y despacho correctos de la cola.
  • /integrations/codeigniter/configuration/ — claves de firma, TSA y rutas.
  • /integrations/codeigniter/troubleshooting/ — mensajes de rechazo verificados.
  • /integrations/codeigniter/overview/ — superficie completa de la API.