Zum Inhalt springen

Sicherheit und Betrieb — NextPDF auf CodeIgniter 4

Diese Seite beschreibt die Bedrohungen, denen diese Integration standhalten muss. Sie benennt die Kontrollen im Paket-Quellcode und gibt betriebliche Regeln für ein sicheres Deployment vor.

Die Integration hat drei Angriffsflächen, die von Angreifern beeinflusst werden können.

  1. Queue-Job-Payload. Eine Queue speichert Job-Daten. Ein Angreifer mit Broker-Zugriff kann diese Daten verändern. Dabei handelt es sich um nicht vertrauenswürdige, deserialisierte Eingaben.
  2. Antwort-Dateiname. Ein Benutzer kann den Download-Dateinamen angeben. Ein bösartig gewählter Name kann Header-Inhalte einschleusen.
  3. Konfigurationspfade. Der Schriftpfad und die Signierpfade stammen aus der Konfiguration. Ein bösartig gesetzter Pfad kann Lese- oder Schreibzugriffe am falschen Ort auslösen.

Der Queue-Job behandelt seinen Payload als nicht vertrauenswürdige, deserialisierte Daten. OWASP ASVS fordert eine sichere Eingabeverarbeitung für deserialisierte, nicht vertrauenswürdige Daten (ASVS V1.5.2).

Geprüfte Kontrollen in GeneratePdfJob:

  • Der Builder muss ein nicht leerer String sein. Der Job lehnt andere Typen ab.
  • Der Builder muss dem Muster App\PdfBuilders\<Class>::<method> entsprechen. Der Job lehnt jeden anderen Namespace, einfache Funktionen sowie Payloads mit Präfix oder Suffix ab.
  • Der Builder muss aufrufbar sein. Der Job lehnt einen String ab, der zwar dem Muster entspricht, sich aber nicht auflösen lässt.

Diese Regeln verhindern, dass über einen manipulierten Queue-Payload beliebiger Code ausgeführt wird. Die Pakettests decken jeden Ablehnungsfall ab.

Der Job schreibt eine Datei in das Dateisystem. OWASP ASVS fordert eine sichere Pfadverarbeitung, wenn eine Anwendung Dateipfade für Dateioperationen erstellt (ASVS V5.3.2).

Geprüfte Kontrollen in GeneratePdfJob:

  • Der Ausgabepfad muss ein nicht leerer String sein.
  • Der Job normalisiert den Pfad. Er löst .- und ..-Segmente auf und vereinheitlicht Trennzeichen vor jeder Prüfung.
  • Der normalisierte Pfad muss innerhalb von WRITEPATH/pdfs/ liegen. Der Job lehnt ein Schwesterverzeichnis ab, das dasselbe Namenspräfix verwendet (pdfs-evil/).
  • Der Pfad muss auf .pdf enden (ohne Beachtung der Groß-/Kleinschreibung).

Diese Regeln verhindern beliebige Dateischreibvorgänge über einen manipulierten Payload.

PdfResponse fügt jeder PDF-Antwort einen festen Satz von Headern hinzu:

HeaderWert
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

Der Dateiname wird bereinigt, bevor er in den Header gelangt. Das Paket entfernt Pfadtrennzeichen, Nullbytes und CR/LF. Für die in Anführungszeichen gesetzte Form maskiert es doppelte Anführungszeichen. Bei einem Nicht-ASCII-Namen fügt es einen RFC 5987-Parameter filename*=UTF-8''… hinzu. Ein leerer Name wird zu document.pdf.

Kontrolle 4 — Validierung der Konfigurationspfade

Abschnitt betitelt „Kontrolle 4 — Validierung der Konfigurationspfade“

Die Schriftregistrierung lehnt einen fontsPath ab, der einen Stream-Wrapper (://) oder ein Nullbyte enthält. Sie löst einen Laufzeitfehler aus. Das blockiert Stream-Wrapper-Pfade wie php:// oder phar://.

Kontrolle 5 — Minimale Service-Locator-Oberfläche

Abschnitt betitelt „Kontrolle 5 — Minimale Service-Locator-Oberfläche“

CodeIgniter 4 hat keinen PSR-11-Container. Es verwendet einen Service-Locator. PSR-11 §1.3 stuft das Service-Locator-Muster als unerwünscht ein (Modalwort SHOULD NOT). Das Paket hält die Locator-Oberfläche klein. Jeder Service wird über eine einzelne benannte Factory-Methode bereitgestellt. Lösen Sie Services an der Controller-Grenze auf. Reichen Sie konkrete Objekte nach innen weiter. Geben Sie die Klasse Services nicht an Domänencode weiter.

Signieren und TSA-Betrieb (NextPDF Pro / Enterprise)

Abschnitt betitelt „Signieren und TSA-Betrieb (NextPDF Pro / Enterprise)“

Der Signierdienst ist standardmäßig inaktiv. Er wird nur aktiv, wenn signature.enabled auf true steht und signature.certificate nicht leer ist. Die standardmäßige Signaturstufe des Pakets ist B-B. NextPDF Pro stellt die B-B-Baseline-Signatur bereit. Die Langzeitvalidierung ist eine eigene Enterprise-Fähigkeit. Sie ist in der Premium-Referenz dokumentiert, nicht hier.

Betriebliche Regeln:

  • Halten Sie Zertifikats- und Schlüsseldateien aus der Versionsverwaltung heraus. Stellen Sie sie über .env oder einen Secrets-Manager bereit.
  • Lassen Sie tsa.allow_insecure_http in der Produktion auf false stehen. Ein TSA-Kanal im Klartext ist nicht akzeptabel.
  • Setzen Sie tsa.pinned_public_keys, wenn die TSA einen stabilen Schlüssel veröffentlicht. Lassen Sie tsa.warn_on_key_rotation auf true stehen.
  • Beschränken Sie den Lesezugriff auf die Schlüsseldatei auf den Anwendungsbenutzer.
  • Fixieren Sie alle aufgelösten Versionen in composer.lock.
  • Setzen Sie codeigniter4/queue in der Anwendung voraus, die Worker ausführt.
  • Führen Sie den Queue-Worker als Benutzer mit niedrigen Rechten aus. Gewähren Sie ihm nur Schreibzugriff auf WRITEPATH/pdfs/.
  • Stellen Sie dem Worker dieselben NextPDF-Erweiterungen wie der Webschicht bereit. Ein signiertes PDF benötigt NextPDF Pro oder Enterprise in der Worker-Umgebung.
  • Bestätigen Sie die Erweiterungen mbstring und zlib in jeder Laufzeitumgebung, die ein PDF erstellt.
  • Bestätigen Sie, dass die Antwort-Header den Reverse-Proxy überstehen.
  • Protokollieren Sie die PDF-Erzeugung mit Kontext. Protokollieren Sie kein Zertifikatsmaterial und keine Schlüsselpasswörter.
  • Die Verarbeitung des Queue-Payloads richtet sich nach OWASP ASVS V1.5.2.
  • Die Verarbeitung des Queue-Ausgabepfads richtet sich nach OWASP ASVS V5.3.2.
  • Der Locator-Entwurf folgt der Vorgabe aus PSR-11 §1.3.

NextPDF Core steht unter Apache-2.0. Vertrauensanker für Signaturen und die TSA-Härtung greifen, wenn NextPDF Pro oder Enterprise installiert ist. Das CodeIgniter-Paket stellt die entsprechenden Service-Methoden bereit, die null zurückgeben, bis das passende Premium-Paket installiert ist. Siehe </get-license/?intent=codeigniter-signing>.

  • /integrations/codeigniter/production-usage/ — korrekte Queue-Registrierung und korrekter Queue-Dispatch.
  • /integrations/codeigniter/configuration/ — Signier-, TSA- und Pfadschlüssel.
  • /integrations/codeigniter/troubleshooting/ — geprüfte Ablehnungsmeldungen.
  • /integrations/codeigniter/overview/ — vollständige API-Oberfläche.