Przejdź do głównej zawartości

Bezpieczeństwo i eksploatacja — NextPDF w CodeIgniter 4

Ta strona opisuje zagrożenia, na które ta integracja musi być odporna, zabezpieczenia zweryfikowane w kodzie źródłowym pakietu oraz zasady eksploatacyjne, których należy przestrzegać, aby wdrożenie pozostało bezpieczne.

Należy uwzględnić trzy powierzchnie, na które może wpływać atakujący.

  1. Ładunek zadania kolejki. Kolejka przechowuje dane zadania. Atakujący z dostępem do brokera może je zmienić. Należy traktować je jako niezaufane, zdeserializowane dane wejściowe.
  2. Nazwa pliku w odpowiedzi. Użytkownik może podać nazwę pliku do pobrania. Złośliwa nazwa może wstrzyknąć treść do nagłówka.
  3. Ścieżki konfiguracji. Ścieżka czcionek oraz ścieżki podpisywania pochodzą z konfiguracji. Złośliwa ścieżka może spowodować odczyt danych z niewłaściwej lokalizacji albo zapis do niej.

Zabezpieczenie 1 — lista dozwolonych ładunków kolejki

Dział zatytułowany „Zabezpieczenie 1 — lista dozwolonych ładunków kolejki”

Zadanie kolejki traktuje ładunek jako niezaufane, zdeserializowane dane. Application Security Verification Standard (ASVS) organizacji Open Worldwide Application Security Project (OWASP) wymaga bezpiecznej obsługi danych wejściowych w przypadku zdeserializowanych niezaufanych danych (ASVS V1.5.2).

Zweryfikowane zabezpieczenia w GeneratePdfJob:

  • Builder musi być niepustym ciągiem znaków. Zadanie odrzuca każdy inny typ.
  • Builder musi pasować do wzorca App\PdfBuilders\<Class>::<method>. Zadanie odrzuca każdą inną przestrzeń nazw, zwykłe funkcje oraz ładunki z przedrostkiem lub przyrostkiem.
  • Builder musi być wywoływalny (callable). Zadanie odrzuca ciąg znaków, który pasuje do wzorca, ale nie rozwiązuje się do callable.

Reguły te łącznie blokują wykonanie dowolnego kodu przez zmanipulowany ładunek kolejki. Testy pakietu weryfikują każdy przypadek odrzucenia.

Zabezpieczenie 2 — ograniczenie ścieżki wyjściowej kolejki

Dział zatytułowany „Zabezpieczenie 2 — ograniczenie ścieżki wyjściowej kolejki”

Zadanie zapisuje plik na dysku. OWASP ASVS wymaga bezpiecznej obsługi ścieżek, gdy aplikacja tworzy ścieżki plików na potrzeby operacji plikowych (ASVS V5.3.2).

Zweryfikowane zabezpieczenia w GeneratePdfJob:

  • Ścieżka wyjściowa musi być niepustym ciągiem znaków.
  • Zadanie normalizuje ścieżkę przed każdą weryfikacją. Rozwiązuje segmenty . oraz .. i konwertuje separatory.
  • Znormalizowana ścieżka musi znajdować się wewnątrz WRITEPATH/pdfs/. Zadanie odrzuca katalog równorzędny ze wspólnym przedrostkiem nazwy (pdfs-evil/).
  • Ścieżka musi kończyć się na .pdf (bez rozróżniania wielkości liter).

Te reguły blokują zapis dowolnych plików za pomocą zmanipulowanego ładunku.

Zabezpieczenie 3 — utwardzenie nagłówków odpowiedzi

Dział zatytułowany „Zabezpieczenie 3 — utwardzenie nagłówków odpowiedzi”

PdfResponse dołącza stały, utwardzony zestaw nagłówków do każdej odpowiedzi w formacie Portable Document Format (PDF):

NagłówekWartość
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

Pakiet sanityzuje nazwę pliku, zanim zostanie ona umieszczona w nagłówku. Usuwa separatory ścieżek, bajty zerowe oraz znaki carriage return i line feed (CR/LF). Stosuje znaki ucieczki dla prostych cudzysłowów w wartości cytowanej. Dodaje parametr filename*=UTF-8''… zgodny z Request for Comments (RFC) 5987 dla nazw spoza zakresu ASCII. Pusta nazwa staje się document.pdf.

Rejestr czcionek odrzuca wartość fontsPath, która zawiera wrapper strumienia (://) lub bajt zerowy, i zgłasza błąd czasu wykonania. Blokuje to ścieżki z wrapperem, takie jak php:// lub phar://.

Zabezpieczenie 5 — minimalna powierzchnia lokatora usług

Dział zatytułowany „Zabezpieczenie 5 — minimalna powierzchnia lokatora usług”

CodeIgniter 4 nie udostępnia kontenera zgodnego z PHP Standards Recommendation 11 (PSR-11). Korzysta z lokatora Services. PSR-11 §1.3 traktuje wzorzec lokatora usług jako niezalecany (modalne SHOULD NOT). Pakiet ogranicza powierzchnię lokatora: każda usługa ma jedną nazwaną metodę fabryczną. Rozwiązuj usługi na granicy kontrolera. Przekazuj konkretne obiekty w głąb. Nie przekazuj klasy Services do kodu domenowego.

Operacje podpisywania i TSA (NextPDF Pro / Enterprise)

Dział zatytułowany „Operacje podpisywania i TSA (NextPDF Pro / Enterprise)”

Usługa podpisywania jest domyślnie nieaktywna. Aktywuje się tylko wtedy, gdy signature.enabled ma wartość true, a signature.certificate jest niepuste. Domyślny poziom podpisu w pakiecie to B-B. NextPDF Pro zapewnia podpis bazowy B-B. Walidacja długoterminowa to odrębna funkcja Enterprise, opisana w dokumentacji Premium, a nie tutaj.

Zasady eksploatacyjne:

  • Nie umieszczaj plików certyfikatów i kluczy w systemie kontroli wersji. Dostarczaj je przez .env lub menedżera sekretów.
  • W środowisku produkcyjnym zachowuj wartość false dla tsa.allow_insecure_http. Kanał urzędu znakowania czasem (Time Stamping Authority, TSA) działający jawnie jest niedopuszczalny.
  • Ustaw tsa.pinned_public_keys, gdy TSA publikuje stabilny klucz. Zachowuj wartość true dla tsa.warn_on_key_rotation.
  • Ogranicz dostęp do odczytu pliku klucza wyłącznie do użytkownika aplikacji.
  • Przypnij wszystkie ustalone wersje w pliku composer.lock.
  • Wymagaj pakietu codeigniter4/queue w aplikacji, która uruchamia workery.
  • Uruchom worker kolejki jako użytkownik o niskich uprawnieniach. Nadaj mu dostęp do zapisu wyłącznie w WRITEPATH/pdfs/.
  • Zapewnij workerowi te same rozszerzenia NextPDF, które ma warstwa webowa. Podpisany plik PDF wymaga NextPDF Pro lub Enterprise w środowisku workera.
  • Upewnij się, że rozszerzenia mbstring oraz zlib są dostępne w każdym środowisku uruchomieniowym, które buduje plik PDF.
  • Upewnij się, że nagłówki odpowiedzi przechodzą przez reverse proxy bez zmian.
  • Rejestruj generowanie plików PDF wraz z kontekstem. Nie rejestruj materiału certyfikatów ani haseł do kluczy.
  • Obsługa ładunku kolejki jest zgodna z OWASP ASVS V1.5.2.
  • Obsługa ścieżki wyjściowej kolejki jest zgodna z OWASP ASVS V5.3.2.
  • Projekt lokatora usług jest zgodny z wytycznymi PSR-11 §1.3.

Rdzeń NextPDF jest objęty licencją Apache-2.0. Kotwice zaufania dla podpisu oraz utwardzenie TSA mają zastosowanie po zainstalowaniu NextPDF Pro lub Enterprise. Pakiet CodeIgniter udostępnia odpowiednie metody usług, które zwracają null, dopóki odpowiedni pakiet Premium nie zostanie zainstalowany. Zobacz </get-license/?intent=codeigniter-signing>.

  • /integrations/codeigniter/production-usage/ — prawidłowa rejestracja i wysyłanie zadań do kolejki.
  • /integrations/codeigniter/configuration/ — klucze podpisywania, TSA i ścieżki.
  • /integrations/codeigniter/troubleshooting/ — zweryfikowane komunikaty o odrzuceniu.
  • /integrations/codeigniter/overview/ — pełna powierzchnia API.