Seguridad y operaciones — NextPDF en CodeIgniter 4
En resumen
Sección titulada «En resumen»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.
Modelo de amenazas
Sección titulada «Modelo de amenazas»Existen tres superficies en las que puede influir un atacante.
- 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.
- 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.
- 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:
| Encabezado | Valor |
|---|---|
X-Content-Type-Options | nosniff |
X-Frame-Options | DENY |
Content-Security-Policy | default-src 'none' |
X-Robots-Tag | noindex, nofollow |
Referrer-Policy | no-referrer |
Cache-Control | private, 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
.envo de un gestor de secretos. - Mantener
tsa.allow_insecure_httpestablecido enfalseen producción. Un canal TSA en texto plano no es aceptable. - Establecer
tsa.pinned_public_keyscuando la TSA publique una clave estable. Mantenertsa.warn_on_key_rotationestablecido entrue. - Restringir el acceso de lectura del archivo de clave al usuario de la aplicación.
Lista de comprobación operativa
Sección titulada «Lista de comprobación operativa»- Fijar todas las versiones resueltas en
composer.lock. - Requerir
codeigniter4/queueen 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
mbstringyzliben 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.
Conformidad
Sección titulada «Conformidad»- 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.
Contexto comercial
Sección titulada «Contexto comercial»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>.
Consulta también
Sección titulada «Consulta también»- /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.