Przejdź do głównej zawartości
getnextpdf.com

Enterprise edycja

Rozbrajanie i rekonstrukcja treści (CDR)

NextPDF Enterprise neutralizuje niezaufany plik PDF metodą rozbrojenia i rekonstrukcji treści (Content Disarm and Reconstruction, CDR): parsuje plik, sprawdza go względem limitów dopuszczenia, wykrywa niebezpieczne funkcje, usuwa je i odbudowuje nowy plik z obiektów, które pozostały. Niebezpieczne funkcje to aktywna treść — osadzone skrypty, akcje uruchamiania, pliki osadzone, treści multimedialne i podobne — które przeglądarka mogłaby wykonać lub na które mogłaby zareagować. Ta strona jest na poziomie zachowania: stwierdza, co silnik dopuszcza, co usuwa, co odbudowuje i dlaczego wynik nie jest kopią dowodową.

CDR to destrukcyjna, jednokierunkowa transformacja. Odbudowany wynik jest projekcją bezpieczeństwa danych wejściowych, a nie zachowaną ani równoważną pod względem skrótu kopią. Tę granicę opisano w sekcji Bezpieczeństwo i zgodność.

Wymagania wstępne podano w nagłówku (front matter) i powtórzono w sekcji Wymagania wstępne.

Ta możliwość jest dostarczana w NextPDF Enterprise (nextpdf/enterprise) i aktywuje się za pomocą koperty licencyjnej w poziomie Enterprise. Wdrożenie bez tego uprawnienia nie ładuje klas tej możliwości. NextPDF Core oraz NextPDF Pro nie udostępniają CDR. Silnik działa w obrębie procesu; niezaufany dokument jest parsowany i odbudowywany na Twoim hoście. Porównaj edycje i uzyskaj licencję.

PDF obsługuje aktywną treść, którą przeglądarka może wykonać lub na którą może zareagować. Akcja ECMAScript powoduje, że procesor PDF wykonuje skrypt, który może zmienić wartości i wyglądy pól, zgodnie z ISO 32000-2 §12.6.4. Akcja uruchamiania uruchamia aplikację albo otwiera lub drukuje dokument, zgodnie z ISO 32000-2 §12.6.4. Skrypty na poziomie dokumentu w słowniku nazw uruchamiają się automatycznie po otwarciu dokumentu, zgodnie z ISO 32000-2 §7.7.4. CDR usuwa te powierzchnie.

Silnik uruchamia uporządkowany potok:

  1. Parsowanie wejściowego pliku PDF.
  2. Kontrola dopuszczenia — weryfikacja, czy dokument mieści się w granicy akceptacji (liczba obiektów, liczba stron, rozmiar zdekodowanego strumienia oraz współczynnik inflacji strumienia, który broni przed wejściami typu bomba dekompresyjna). Dokument poza limitami jest odrzucany, a nie sanityzowany. Odrzucenie jest raportowane w sposób odróżnialny od wyniku sanityzacji, aby Twoja obsługa błędów mogła odróżnić te dwa przypadki.
  3. Wykrywanie zagrożeń — skanowanie pod kątem skonfigurowanych typów zagrożeń.
  4. Filtrowanie — podział obiektów na zbiór bezpieczny i zbiór usunięty.
  5. Czyszczenie odwołań — czyszczenie wskaźników pozostawionych jako wiszące przez usunięcie.
  6. Odbudowa — serializacja bezpiecznych obiektów do nowego pliku PDF.

Wykrywalne typy zagrożeń obejmują osadzone skrypty (oraz agresywne usuwanie skryptów, które wychwytuje skrypty w zniekształconych strukturach), wyzwalacze akcji dodatkowych i akcji otwarcia, akcje uruchamiania, akcje zdalnego przejścia (remote go-to), akcje przesłania i importu danych formularza, pliki osadzone, treści multimedialne i trójwymiarowe, drzewa nazw skryptów na poziomie dokumentu, zewnętrzne akcje Uniform Resource Identifier (URI), dane XML Forms Architecture, interaktywne pola formularzy, niedomyślne warstwy treści opcjonalnej oraz obiekty podpisu cyfrowego (które odbudowa z konieczności unieważnia, ponieważ zakresy bajtów przestają się zgadzać). Obiekt, którego nie da się sparsować, jest sam traktowany jako potencjalne obejście i usuwany.

Trzy polityki ustalają wartości domyślne:

  • Standard — usuwa wykrywalne przez silnik, skonfigurowane typy zagrożeń aktywnej treści; aktualizacje przyrostowe są zawsze spłaszczane, aby bronić przed cieniowaniem podpisu (signature-shadowing), a to spłaszczanie nie jest w tym trybie konfigurowalne.
  • Paranoid — te same usunięcia z ciaśniejszymi limitami zasobów.
  • Permissive — dla zaufanych źródeł: usuwa skrypty i akcje uruchamiania, ale zachowuje akcje URI oraz czyni spłaszczanie aktualizacji przyrostowych konfigurowalnym.

CDR odbudowuje nowy plik z obiektów, które uznał za bezpieczne, zamiast usuwać niebezpieczne klucze w miejscu. Ta postawa listy dozwolonych (allow-list) jest decyzją nośną. Obiekt, którego detektor nigdy nie rozpoznał — w tym taki, którego nie dało się sparsować — nie przetrwa do wyniku, więc nieznana struktura zawodzi w sposób bezpieczny (fail closed), zamiast prześlizgnąć się przez lukę listy zablokowanych (deny-list). Kontrola dopuszczenia działa jako pierwsza z tego samego powodu: wejście przekraczające limit lub niemożliwe do sparsowania jest odrzucane wprost, nigdy częściowo odbudowywane. Kosztem tego bezpieczeństwa jest zachowanie treści. Odbudowa zmienia układ bajtów, unieważnia podpisy i odrzuca ładunki, których typ zagrożenia jest usuwany — dlatego wynik jest projekcją bezpieczeństwa, nigdy kopią dowodową.

Tło projektowe: Sanityzacja niezaufanych plików PDF: rozbrajanie i rekonstrukcja treści.

  1. Zainstaluj NextPDF Core oraz pakiet Enterprise i utrzymuj aktywną licencję Enterprise.
  2. Zdefiniuj granicę akceptacji dla swoich danych wejściowych — maksymalną liczbę obiektów, liczbę stron, rozmiar zdekodowanego strumienia oraz współczynnik inflacji — albo użyj limitów wstępnie zdefiniowanej polityki.
  3. Zdecyduj o polityce: standard dla ogólnego przyjmowania treści niezaufanej, paranoid dla najsurowszej postawy lub permissive wyłącznie dla zaufanych źródeł.

Polityka jest niemutowalna i niesie:

  • Typy zagrożeń do usunięcia — zbiór, który detektor skanuje, a moduł odbudowy usuwa.
  • Obsługa akcji URI — czy zewnętrzne akcje URI są zachowywane.
  • Spłaszczanie aktualizacji przyrostowych — zawsze włączone w standard i paranoid; konfigurowalne w permissive.
  • Limity dopuszczenia — maksymalna liczba obiektów, liczba stron, rozmiar zdekodowanego strumienia oraz współczynnik inflacji. To granica akceptacji, a nie zachowanie sanityzacji; ich przekroczenie odrzuca dokument.
  1. Odczytaj bajty niezaufanego pliku PDF.
  2. Wybierz politykę (standard, paranoid lub permissive) albo zbuduj własną z jawnymi limitami.
  3. Uruchom operację sanityzacji silnika z bajtami i polityką.
  4. Zbadaj wynik: jeśli raportuje niedopuszczony, ujawnij powód odrzucenia; w przeciwnym razie użyj odbudowanych bajtów oraz listy usuniętych zagrożeń.
  5. Traktuj odbudowany wynik jako zsanityzowaną projekcję, nigdy jako kopię dowodową ani archiwalną danych wejściowych.
examples/enterprise/cdr-sanitize-guarded.php
<?php
declare(strict_types=1);
require_once __DIR__ . '/../../vendor/autoload.php';
use NextPDF\Enterprise\Security\Cdr\CdrEngine;
use NextPDF\Enterprise\Security\Cdr\CdrPolicy;
use NextPDF\Enterprise\Security\Cdr\CdrResult;
use Psr\Log\LoggerInterface;
final readonly class UntrustedPdfIntake
{
public function __construct(
private CdrEngine $engine,
private LoggerInterface $logger,
) {}
/**
* Sanitize an untrusted PDF and distinguish rejection from a clean rebuild.
*
* An over-limit document is rejected by admission control, not sanitized;
* the caller surfaces the rejection reason instead of trusting an empty
* output. The rebuilt bytes are a security projection, never an
* evidentiary copy of the input.
*
* @param string $pdfBytes The untrusted PDF bytes.
*
* @return CdrResult The sanitization result, including admission status.
*/
public function sanitize(string $pdfBytes): CdrResult
{
$result = $this->engine->sanitize($pdfBytes, CdrPolicy::standard());
if (! $result->admitted) {
$this->logger->warning('PDF rejected by CDR admission control', [
'reason' => $result->rejectionReason,
]);
return $result;
}
$this->logger->info('PDF sanitized', [
'removedThreats' => \count($result->removedThreats),
'originalSize' => $result->originalSize,
'sanitizedSize' => $result->sanitizedSize,
]);
return $result;
}
}
  1. Uruchom próbkę niosącą znaną powierzchnię aktywnej treści (na przykład skrypt na poziomie dokumentu) i potwierdź, że pojawia się ona na liście usuniętych zagrożeń i jest nieobecna w odbudowanym wyniku.
  2. Uruchom dokument przekraczający limit i potwierdź, że wynik raportuje niedopuszczony z powodem odrzucenia, a odbudowane bajty są puste.
  3. Potwierdź, że podpisane cyfrowo wejście ma usunięte obiekty podpisu w odbudowie — odbudowa unieważnia oryginalny podpis, ponieważ zakresy bajtów się zmieniają, więc nieaktualne obiekty podpisu są z założenia usuwane.
  4. Otwórz odbudowany wynik w przeglądarce i potwierdź, że po otwarciu nie wykonuje się żaden skrypt.
  • Nie do celów dowodowych. Odbudowany wynik to destrukcyjna, nieodwracalna projekcja. Nie używaj go do zachowywania dowodów prawnych, do porównania skrótu z oryginałem ani jako kopii archiwalnej. Zachowaj oryginał pod oddzielną pieczą, jeśli potrzebujesz kopii dowodowej.
  • Dopuszczenie przed sanityzacją. Limity zasobów to granica akceptacji; dokument przekraczający limit jest odrzucany, a nie sanityzowany. Raportuj odrzucenie w sposób odróżnialny, aby wejścia przekraczającego limit nigdy nie pomylić z czystą odbudową.
  • Aktywna treść jest usuwana. Skrypty, akcje uruchamiania, drzewa nazw skryptów na poziomie dokumentu, pliki osadzone, treści multimedialne i podobne powierzchnie są usuwane — to właśnie te akcje, które przeglądarka w przeciwnym razie by wykonała (ISO 32000-2 §12.6.4 akcja ECMAScript; akcja uruchamiania; skrypty na poziomie dokumentu §7.7.4).
  • Podpisy są unieważniane przez odbudowę. Ponieważ odbudowa zmienia układ bajtów, oryginalny podpis nie może już zostać zwalidowany; obiekty podpisu są usuwane, zamiast pozostawiać je w mylący sposób na miejscu.
  • Stratne z założenia. Ładunki plików osadzonych — w tym załączniki faktur, takie jak Factur-X — są usuwane, gdy ich typ zagrożenia jest usuwany. CDR to projekcja bezpieczeństwa, a nie warstwa zachowywania.

Ta strona dotyczy bezpieczeństwa dokumentów. Każde źródło normatywne jest sparafrazowane; żaden tekst normatywny nie jest odtwarzany.

  • Niepowodzenie parsowania. Dokument, którego nie da się sparsować, daje wynik niedopuszczony z powodem błędu parsowania, a nie częściową odbudowę.
  • Wejście przekraczające limit. Wynik raportuje niedopuszczony z powodem właściwym dla limitu; odbudowane bajty są puste.
  • Obiekt niemożliwy do sparsowania. Obiekt, którego nie da się sparsować, jest traktowany jako potencjalne obejście i usuwany, a nie po cichu zachowywany.
  • Najlepsze możliwe liczenie stron. Sprawdzenie dopuszczenia liczby stron jest realizowane na zasadzie najlepszego możliwego wyniku; zniekształcony katalog nie powoduje awarii potoku, ale limity liczby obiektów i strumieni nadal obowiązują.

Ta strona dokumentuje wyłącznie zachowanie obserwowalne z zewnątrz oraz obsługiwaną publiczną powierzchnię API. Wewnętrzne ścieżki przestrzeni nazw, klasy pomocnicze, tabele mechanizmów, nazwy plików runbooków oraz prefiksy zgłoszeń są poza zakresem.