Enterprise editie
Content Disarm and Reconstruction — Diepe referentie
In één oogopslag
Sectie met titel “In één oogopslag”Deze pagina is de diepgaande referentie voor de NextPDF\Enterprise\Security\Cdr-module. De module ontwapent een niet-vertrouwde PDF en reconstrueert een schoon bestand uit de veilige objecten ervan. De pijplijn is: parsen, toelatingscontrole, dreigingsdetectie, filteren, referentiescrubbing, rebuild. De uitvoer is een beveiligingsprojectie van de invoer, nooit een bewijskopie. Lees voor workflow-begeleiding eerst de CDR-capaciteitspagina.
Beschikbaarheid en licentie
Sectie met titel “Beschikbaarheid en licentie”Deze functionaliteit wordt geleverd in NextPDF Enterprise (nextpdf/enterprise) en wordt geactiveerd met een licentie-envelop van de Enterprise-tier. Een deployment zonder die rechten laadt de klassen van de functionaliteit niet. Vergelijk edities en verkrijg een licentie.
Publiek API-oppervlak
Sectie met titel “Publiek API-oppervlak”| Symbool | Parameters | Standaardgedrag | Retourneert | Gooit of faalt met | Opmerkingen |
|---|---|---|---|---|---|
CdrEngine::__construct | geen | Construeert de interne detector en rebuilder | CdrEngine | Niets gedeclareerd | Geen injecteerbare collaborators |
CdrEngine::sanitize | string $pdfData, ?CdrPolicy $policy = null | Voert de volledige pijplijn uit onder CdrPolicy::standard() | CdrResult | Gooit niet bij vijandige invoer; parse- en toelatingsfouten retourneren een afgewezen resultaat | Het resultaat rapporteert afwijzing los van sanering |
CdrPolicy::__construct | zeven optionele benoemde parameters, zie fence | Lege verwijderset; allowUriActions false; flattenIncrementalUpdates true; limieten 100000 objecten, 256 MiB gedecodeerd, 10000 pagina’s, 1000.0 inflatie | CdrPolicy | Niets gedeclareerd | final readonly; een lege removeThreatTypes-lijst detecteert niets |
CdrPolicy::standard | geen | Legacy-dreigingsset; URI-acties verwijderd; standaardlimieten | self | Niets gedeclareerd | Sluit de zeven lossy Strip*-cases uit |
CdrPolicy::paranoid | geen | Legacy-dreigingsset met strengere limieten: 50000 objecten, 128 MiB, 5000 pagina’s, 100.0 inflatie | self | Niets gedeclareerd | Sluit de zeven lossy Strip*-cases uit |
CdrPolicy::permissive | geen | Verwijdert alleen JavaScript, LaunchAction, NamedJavaScript, SubmitForm, ImportData; behoudt URI-acties | self | Niets gedeclareerd | Bedoeld voor vertrouwde bronnen |
CdrPolicy::allThreatTypes | geen | Retourneert elke ThreatType-case, inclusief de lossy Strip*-cases | list<ThreatType> | Niets gedeclareerd | De expliciete opt-in voor maximale strip |
CdrPolicy::legacyThreatTypes | geen | Retourneert elke case behalve de zeven Strip*-cases | list<ThreatType> | Niets gedeclareerd | Standaardverwijderset voor standard() en paranoid() |
CdrPolicy::shouldRemove | ThreatType $type | Lidmaatschapstest tegen removeThreatTypes | bool | Niets gedeclareerd | Retourneert false voor UriAction wanneer allowUriActions true is |
ThreatDetector::detect | PdfReader $reader, CdrPolicy $policy | Scant elk object en de trailer-catalogus op de dreigingstypen van het beleid | list<DetectedThreat> | Gooit niet; een niet-parseerbaar object wordt een UnparseableObject-dreiging | Catalogusscan omvat de /Names/JavaScript-boom |
CdrRebuilder::rebuild | PdfReader $reader, list<int> $safeObjNums, list<int> $removedObjNums, CdrPolicy $policy | Serialiseert veilige objecten in een %PDF-2.0-bestand met één revisie | string | Niets gedeclareerd; objecten die falen bij herlezen of /Length-validatie worden overgeslagen | $policy is gereserveerd voor toekomstige serialisatie-aanpassingen |
DetectedThreat::__construct | ThreatType $type, int $objectNumber, string $description, string $location = '' | Immutable value-object voor bevindingen | DetectedThreat | Niets gedeclareerd | Alle vier de properties zijn public readonly |
ThreatType | string-backed enum | Twintig cases: dertien legacy plus zeven opt-in Strip*-cases | n/a | n/a | Zie de case-inventaris hieronder |
Signaturen van entry-points
Sectie met titel “Signaturen van entry-points”final class CdrEngine{ public function __construct()
public function sanitize(string $pdfData, ?CdrPolicy $policy = null): CdrResult}final readonly class CdrPolicy{ public function __construct( public array $removeThreatTypes = [], public bool $allowUriActions = false, public bool $flattenIncrementalUpdates = true, public int $maxObjects = 100_000, public int $maxDecodedStreamBytes = 268_435_456, public int $maxPageCount = 10_000, public float $maxInflationRatio = 1000.0, )
public static function standard(): self
public static function paranoid(): self
public static function permissive(): self
public static function allThreatTypes(): array
public static function legacyThreatTypes(): array
public function shouldRemove(ThreatType $type): bool}final class ThreatDetector{ public function detect(PdfReader $reader, CdrPolicy $policy): array}final class CdrRebuilder{ public function rebuild(PdfReader $reader, array $safeObjNums, array $removedObjNums, CdrPolicy $policy): string}final readonly class DetectedThreat{ public function __construct( public ThreatType $type, public int $objectNumber, public string $description, public string $location = '', )}enum ThreatType: stringThreatType-case-inventaris
Sectie met titel “ThreatType-case-inventaris”Dertien legacy-cases vormen de standaardverwijderset. De Strip*-cases zijn lossy door ontwerp en komen nooit in een standaardbeleid terecht.
| Case | Backing-waarde | Detectieoppervlak |
|---|---|---|
ThreatType::JavaScript | javascript | /JS-key op elk object, of een /S /JavaScript-actie |
ThreatType::AdditionalActions | additional-actions | /AA-dictionary op elk object |
ThreatType::OpenAction | open-action | /OpenAction-key op elk object |
ThreatType::LaunchAction | launch-action | /S /Launch-actie |
ThreatType::RemoteGoTo | remote-goto | /S /GoToR- of /S /GoToE-actie |
ThreatType::SubmitForm | submit-form | /S /SubmitForm-actie |
ThreatType::ImportData | import-data | /S /ImportData-actie |
ThreatType::EmbeddedFiles | embedded-files | /EmbeddedFiles-name-tree of /EF-dictionary |
ThreatType::RichMedia | rich-media | /Subtype /RichMedia |
ThreatType::NamedJavaScript | named-javascript | Catalogus-/Names/JavaScript-name-tree |
ThreatType::UriAction | uri-action | /S /URI-actie; onderdrukt wanneer allowUriActions true is |
ThreatType::Xfa | xfa | /XFA-key |
ThreatType::UnparseableObject | unparseable-object | Elk object of elke catalogus die niet parseert |
ThreatType::StripJavaScript | strip-javascript | Opt-in-superset: /JS-key, /S /JavaScript, of /Subtype /JavaScript |
ThreatType::StripEmbeddedFiles | strip-embedded-files | Opt-in: /Type /EmbeddedFile, /Type /Filespec, /EmbeddedFiles, of /EF |
ThreatType::StripFormFields | strip-form-fields | Opt-in: /Subtype /Widget, /FT-key, of /AcroForm-key |
ThreatType::StripAnnotationsRich | strip-annotations-rich | Opt-in-subtypes: Movie, Sound, FileAttachment, 3D, RichMedia, Screen |
ThreatType::StripOcgNonDefault | strip-ocg-non-default | Opt-in: /Type /OCG met een /Usage- of /Visibility-key |
ThreatType::StripDigitalSignaturesAtRebuild | strip-digital-signatures-at-rebuild | Opt-in: /Type /Sig, /FT /Sig, /DSS, /VRI, of /ByteRange |
ThreatType::Strip3dAndRichMedia | strip-3d-and-rich-media | Opt-in-subtypes: 3D, U3D, PRC, RMF, RichMedia, Sound, Movie |
Gedragscontract
Sectie met titel “Gedragscontract”CdrEngine::sanitize voert zes geordende fasen uit en gooit nooit bij vijandige invoer.
- Parsen. Een parse-fout retourneert een resultaat met
admittedfalse en een parse-error als afwijzingsreden. De gesaneerde uitvoer is in dat geval leeg. - Toelatingscontrole. Het aantal objecten, de totale gedecodeerde streambytes, de inflatieverhouding per stream en het aantal pagina’s worden gecontroleerd tegen de beleidslimieten. Een document dat de limiet overschrijdt wordt afgewezen, niet gesaneerd. Afwijzing en sanering worden apart gerapporteerd.
- Detectie.
ThreatDetector::detectscant elk object en de trailer-catalogus op de dreigingstypen van het beleid. Niet-parseerbare objecten worden geregistreerd alsThreatType::UnparseableObject-bevindingen in plaats van overgeslagen. - Filteren. Objecten met bevindingen worden in de wachtrij voor verwijdering gezet. De documentcatalogus wordt nooit als heel object verwijderd. Bevindingen op catalogusniveau (
OpenAction,AdditionalActions,NamedJavaScript) worden in plaats daarvan verholpen door key-stripping. - Referentiescrubbing. Elke indirecte referentie naar een verwijderd object wordt tijdens serialisatie vervangen door
null. - Rebuild.
CdrRebuilder::rebuildproduceert een%PDF-2.0-bestand met één revisie, hernummerde objecten, een klassieke cross-reference-tabel en een verse trailer. Veilige streambytes worden byte-identiek gekopieerd. De herbouwde catalogus laat/OpenAction,/AAen/Namesvallen;/AAwordt uit elk object verwijderd.
Het geretourneerde CdrResult stelt de herbouwde bytes, de lijst met verwijderde dreigingen, beide bytegroottes, de toelatingsvlag en de afwijzingsreden beschikbaar. Als de bron een oplosbare /Root had en de herbouwde uitvoer die kwijtraakte, wijst de engine de uitvoer af in plaats van een structureel kapot bestand te retourneren. Dit is een fail-closed-garantie: admitted true impliceert dat de uitvoer nog steeds een verwijzing naar een documentcatalogus draagt.
Incrementele updates overleven nooit: de rebuild serialiseert onder elk beleid precies één revisie, dus shadow-achtige late revisies worden door constructie afgevlakt. Originele digitale handtekeningen kunnen na een rebuild niet geldig blijven, omdat de byte ranges niet meer overeenkomen met de uitvoer.
Architecturale rode lijn. CDR is een beveiligingsprojectielaag, geen behoudslaag. De uitvoer mag niet worden gebruikt voor juridisch bewijsbehoud, hashvergelijking met het origineel of archiefkopieën.
Randgevallen en foutmodi
Sectie met titel “Randgevallen en foutmodi”- Een
null-beleid wordt omgezet naarCdrPolicy::standard(). Een beleid dat is geconstrueerd met de standaard legeremoveThreatTypesdetecteert en verwijdert niets. allowUriActionsoptrueonderdruktUriAction-verwijdering, zelfs wanneer de case aanwezig is inremoveThreatTypes.flattenIncrementalUpdatesis declaratief in deze release: de rebuild produceert onder elk beleid één revisie, inclusiefpermissive(), dat de vlag opfalsezet.- De inflatieverhoudingscontrole behandelt een ruwe streamlengte van nul als één, zodat een stream die vanuit niets inflatert nog steeds begrensd is. Wanneer geen gedecodeerde vorm wordt behouden, telt de ruwe streamlengte mee voor het totaalbudget.
- De toelatingscontrole op paginatelling is best-effort: een leesfout in de catalogus of paginaboom wijst het document op zichzelf niet af. De budgetten voor objecttelling en decompressie worden altijd afgedwongen.
- Een object waarvan de ruwe streamlengte niet overeenkomt met zijn integer
/Length-entry wordt bij de rebuild overgeslagen (polyglot-verdediging). Een verwijzing naar zo’n overgeslagen object behoudt zijn bronobjectnummer en wordt mogelijk niet opgelost in de uitvoer.sanitize()weigert detecteerbaar kapotte resultaten (een ontbrekende/Root), maar een aanroeper die de low-levelCdrRebuilder::rebuild()rechtstreeks aanstuurt, moet de uitvoerstructuur en referentie-integriteit zelf opnieuw valideren. - Wanneer de brontrailer
/IDdraagt, draagt de herbouwde trailer een vers gegenereerde willekeurige/ID, niet het origineel. Andere trailer-entries, inclusief/Info, worden niet overgenomen; de herbouwde trailer bevat/Size,/Rootwanneer oplosbaar, en de opnieuw gegenereerde/ID. - Gedecodeerde naam- en key-bytes worden opnieuw geëmitteerd met hexadecimale escapes voor scheidingstekens, witruimte en niet-afdrukbare bytes, zodat vijandige namen geen dictionary-syntaxis in de uitvoer kunnen injecteren.
- Stringwaarden onder dictionary-keys buiten de bekende name-valued-set worden conservatief als literal strings geëmitteerd.
CdrPolicy::legacyThreatTypes()behandelt elke toekomstige enum-case als standaard-verwijderd, tenzij deze is geregistreerd als eenStrip*-case, zodat nieuwe lossy-cases niet stilzwijgend in standaardbeleid terecht kunnen komen.- CDR is geen cryptografische module. Het enige gebruik van willekeur is de opnieuw gegenereerde trailer-
/ID. Handtekeningvalidatie valt hier buiten scope; zie de Signature diepgaande referentie.
Conformiteit
Sectie met titel “Conformiteit”| Claim | Standaard | Clausule |
|---|---|---|
| Het aanroepen van een ECMAScript-actie laat een PDF-processor het ingebedde script uitvoeren. | ISO 32000-2 | §12.6.4.17 |
Document-niveau-scripts in de JavaScript-name-tree worden allemaal uitgevoerd wanneer het document opent. | ISO 32000-2 | §12.6.4.17 |
De catalogus-name-dictionary kan een JavaScript-name-tree van document-niveau-scriptacties bevatten. | ISO 32000-2 | §7.7.4 (Table 32) |
| Een launch-actie start een applicatie, of opent of print een document. | ISO 32000-2 | §12.6.4.6 |
/AA-additional-actions-dictionaries breiden de trigger-events uit op annotaties, pagina’s, velden en de catalogus. | ISO 32000-2 | §12.6.3 |
| Intake van niet-vertrouwde bestanden moet de aanwezigheid, het volume en de inhoud van binnenkomende bestanden begrenzen. | OWASP ASVS 5.0 | §5.2 |
| Systemen moeten ongepaste uitvoering van geüploade bestanden voorkomen en gevaarlijke inhoud detecteren. | OWASP ASVS 5.0 | §5.3 |
Alle clausules zijn geparafraseerd; NextPDF reproduceert geen normatieve tekst. NextPDF doet geen certificeringsclaim. CDR verwijdert de actieve-inhoudsoppervlakken die door ThreatType worden opgesomd onder het geconfigureerde beleid; het is een functionaliteit, geen gecertificeerde sanitizer. CDR is geen antivirusscanner en detecteert geen malwaresignatures; het vult controles zoals OWASP ASVS 5.4.3 antivirusscanning aan, maar voldoet er niet aan. Of een ontwapend bestand acceptabel is voor een bepaalde intakepijplijn blijft de risicobeslissing van de operator.
Ontwikkelnotities
Sectie met titel “Ontwikkelnotities”- De modulebroncode draagt
@since 1.9.0; deze referentie documenteert het oppervlak zoals geleverd innextpdf/enterprise3.1.0. - Alles draait in-process op je host. Er vindt geen netwerktoegang plaats tijdens sanering.
CdrPolicyenDetectedThreatzijnfinal readonly; construeer een nieuwe policy-instantie om limieten te wijzigen.CdrEngineconstrueert zijn detector en rebuilder intern.ThreatDetectorenCdrRebuilderblijven direct bruikbaar voor gefaseerde pijplijnen die hun eigenPdfReaderleveren.- De
$policy-parameter vanCdrRebuilder::rebuildis momenteel gereserveerd; de broncode documenteert deze als behouden voor call-site-compatibiliteit en toekomstige per-policy-serialisatie-aanpassingen. - De uitvoer is structureel reproduceerbaar, niet bitgewijs reproduceerbaar: de opnieuw gegenereerde
/IDverschilt bij elke run wanneer de bron er een droeg. - Het resultaattype
CdrResult(retourwaarde vansanitize()) is hierboven gedragsmatig behandeld; zijn velden zijnpublic readonly, methadThreats()enthreatCount()als gemaksmethoden.
Zie ook
Sectie met titel “Zie ook”- Content Disarm and Reconstruction (CDR) — de capaciteitspagina met workflow- en beleidsbegeleiding.
- Security — diepgaande referentie
- Validation — diepgaande referentie
- Forensics — diepgaande referentie
Publicatiegrens
Sectie met titel “Publicatiegrens”Deze pagina documenteert alleen extern waarneembaar gedrag en het ondersteunde publieke API-oppervlak. Interne namespace-paden, helperklassen, mechanismetabellen, runbook-bestandsnamen en ticket-prefixen vallen buiten scope.