İçeriğe geç
getnextpdf.com

Enterprise sürüm

İçerik Silahsızlandırma ve Yeniden Yapılandırma — Derinlemesine başvuru

Bu sayfa, NextPDF\Enterprise\Security\Cdr modülü için derin başvurudur. Modül, güvenilmeyen bir PDF’i silahsızlandırır ve onun güvenli nesnelerinden temiz bir dosya yeniden yapılandırır. Hat şudur: ayrıştırma, kabul denetimi, tehdit algılama, filtreleme, referans temizleme, yeniden yapılandırma. Çıktı, girdinin bir güvenlik izdüşümüdür; asla bir kanıt kopyası değildir. İş akışı rehberliği için önce CDR yetenek sayfasını okuyun.

Bu yetenek NextPDF Enterprise (nextpdf/enterprise) ile gelir ve bir Enterprise katmanı lisans zarfıyla etkinleşir. Bu yetkilendirmeye sahip olmayan bir dağıtım, yeteneğin sınıflarını yüklemez. Sürümleri karşılaştırın ve bir lisans edinin.

SimgeParametrelerVarsayılan davranışDöndürürFırlattığı ya da başarısız olduğu durumNotlar
CdrEngine::__constructyokDahili dedektörü ve yeniden yapılandırıcıyı oluştururCdrEngineBildirilmiş bir şey yokEnjekte edilebilir iş birlikçisi yok
CdrEngine::sanitizestring $pdfData, ?CdrPolicy $policy = nullTam hattı CdrPolicy::standard() altında çalıştırırCdrResultDüşmanca girdide fırlatmaz; ayrıştırma ve kabul başarısızlıkları reddedilmiş bir sonuç döndürürSonuç, reddi sanitizasyondan ayrı olarak bildirir
CdrPolicy::__constructyedi isteğe bağlı adlandırılmış parametre, koda bakınBoş kaldırma kümesi; allowUriActions false; flattenIncrementalUpdates true; sınırlar 100000 nesne, 256 MiB çözülmüş, 10000 sayfa, 1000.0 şişmeCdrPolicyBildirilmiş bir şey yokfinal readonly; boş bir removeThreatTypes listesi hiçbir şey algılamaz
CdrPolicy::standardyokLegacy tehdit kümesi; URI eylemleri kaldırılır; varsayılan sınırlarselfBildirilmiş bir şey yokYedi kayıplı Strip* durumunu hariç tutar
CdrPolicy::paranoidyokDaha sıkı sınırlarla legacy tehdit kümesi: 50000 nesne, 128 MiB, 5000 sayfa, 100.0 şişmeselfBildirilmiş bir şey yokYedi kayıplı Strip* durumunu hariç tutar
CdrPolicy::permissiveyokYalnızca JavaScript, LaunchAction, NamedJavaScript, SubmitForm, ImportData kaldırır; URI eylemlerini korurselfBildirilmiş bir şey yokGüvenilir kaynaklar için tasarlanmıştır
CdrPolicy::allThreatTypesyokKayıplı Strip* durumları dahil her ThreatType durumunu döndürürlist<ThreatType>Bildirilmiş bir şey yokAçık maksimal-strip tercihi
CdrPolicy::legacyThreatTypesyokYedi Strip* durumu dışındaki her durumu döndürürlist<ThreatType>Bildirilmiş bir şey yokstandard() ve paranoid() için varsayılan kaldırma kümesi
CdrPolicy::shouldRemoveThreatType $typeremoveThreatTypes karşısında üyelik testiboolBildirilmiş bir şey yokallowUriActions true olduğunda UriAction için false döndürür
ThreatDetector::detectPdfReader $reader, CdrPolicy $policyHer nesneyi ve fragman kataloğunu ilkenin tehdit türleri için tararlist<DetectedThreat>Fırlatmaz; ayrıştırılamayan bir nesne bir UnparseableObject tehdidine dönüşürKatalog taraması /Names/JavaScript ağacını kapsar
CdrRebuilder::rebuildPdfReader $reader, list<int> $safeObjNums, list<int> $removedObjNums, CdrPolicy $policyGüvenli nesneleri tek revizyonlu bir %PDF-2.0 dosyaya seri hâle getirirstringBildirilmiş bir şey yok; yeniden okumada ya da /Length doğrulamasında başarısız olan nesneler atlanır$policy, gelecekteki seri hâle getirme ayarlamaları için ayrılmıştır
DetectedThreat::__constructThreatType $type, int $objectNumber, string $description, string $location = ''Değişmez bulgu değer nesnesiDetectedThreatBildirilmiş bir şey yokDört özelliğin tümü public readonly
ThreatTypestring destekli enumYirmi durum: on üç legacy artı yedi tercihe bağlı Strip* durumyokyokAşağıdaki durum envanterine bakın
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: string

On üç legacy durum, varsayılan kaldırma kümesini oluşturur. Strip* durumları tasarım gereği kayıplıdır ve asla varsayılan bir ilkeye girmez.

DurumDestekleyici değerAlgılama yüzeyi
ThreatType::JavaScriptjavascriptHerhangi bir nesnede /JS anahtarı ya da bir /S /JavaScript eylemi
ThreatType::AdditionalActionsadditional-actionsHerhangi bir nesnede /AA sözlüğü
ThreatType::OpenActionopen-actionHerhangi bir nesnede /OpenAction anahtarı
ThreatType::LaunchActionlaunch-action/S /Launch eylemi
ThreatType::RemoteGoToremote-goto/S /GoToR ya da /S /GoToE eylemi
ThreatType::SubmitFormsubmit-form/S /SubmitForm eylemi
ThreatType::ImportDataimport-data/S /ImportData eylemi
ThreatType::EmbeddedFilesembedded-files/EmbeddedFiles ad ağacı ya da /EF sözlüğü
ThreatType::RichMediarich-media/Subtype /RichMedia
ThreatType::NamedJavaScriptnamed-javascriptKatalog /Names/JavaScript ad ağacı
ThreatType::UriActionuri-action/S /URI eylemi; allowUriActions true olduğunda bastırılır
ThreatType::Xfaxfa/XFA anahtarı
ThreatType::UnparseableObjectunparseable-objectAyrıştırmada başarısız olan herhangi bir nesne ya da katalog
ThreatType::StripJavaScriptstrip-javascriptTercihe bağlı üst küme: /JS anahtarı, /S /JavaScript ya da /Subtype /JavaScript
ThreatType::StripEmbeddedFilesstrip-embedded-filesTercihe bağlı: /Type /EmbeddedFile, /Type /Filespec, /EmbeddedFiles ya da /EF
ThreatType::StripFormFieldsstrip-form-fieldsTercihe bağlı: /Subtype /Widget, /FT anahtarı ya da /AcroForm anahtarı
ThreatType::StripAnnotationsRichstrip-annotations-richTercihe bağlı alt türler: Movie, Sound, FileAttachment, 3D, RichMedia, Screen
ThreatType::StripOcgNonDefaultstrip-ocg-non-defaultTercihe bağlı: /Usage ya da /Visibility anahtarıyla /Type /OCG
ThreatType::StripDigitalSignaturesAtRebuildstrip-digital-signatures-at-rebuildTercihe bağlı: /Type /Sig, /FT /Sig, /DSS, /VRI ya da /ByteRange
ThreatType::Strip3dAndRichMediastrip-3d-and-rich-mediaTercihe bağlı alt türler: 3D, U3D, PRC, RMF, RichMedia, Sound, Movie

CdrEngine::sanitize altı sıralı aşama yürütür ve düşmanca girdi için asla fırlatmaz.

  1. Ayrıştırma. Bir ayrıştırma başarısızlığı, admitted false ve bir ayrıştırma-hatası red nedeniyle bir sonuç döndürür. Bu durumda sanitize edilmiş çıktı boştur.
  2. Kabul denetimi. Nesne sayısı, toplam çözülmüş akış baytları, akış başına şişme oranı ve sayfa sayısı ilke sınırlarına karşı denetlenir. Sınırı aşan bir belge sanitize edilmez, reddedilir. Red ve sanitizasyon ayrı olarak bildirilir.
  3. Algılama. ThreatDetector::detect her nesneyi ve fragman kataloğunu ilkenin tehdit türleri için tarar. Ayrıştırılamayan nesneler atlanmak yerine ThreatType::UnparseableObject bulguları olarak kaydedilir.
  4. Filtreleme. Bulgu taşıyan nesneler kaldırma için kuyruğa alınır. Belge kataloğu asla bütün bir nesne olarak kaldırılmaz. Katalog düzeyindeki bulgular (OpenAction, AdditionalActions, NamedJavaScript) bunun yerine anahtar temizleme ile iyileştirilir.
  5. Referans temizleme. Kaldırılan bir nesneye yapılan her dolaylı referans, seri hâle getirme sırasında null ile değiştirilir.
  6. Yeniden yapılandırma. CdrRebuilder::rebuild, yeniden numaralandırılmış nesneler, klasik bir çapraz referans tablosu ve taze bir fragman içeren tek revizyonlu bir %PDF-2.0 dosya üretir. Güvenli akış baytları bayt bakımından aynı şekilde kopyalanır. Yeniden yapılandırılmış katalog /OpenAction, /AA ve /Names öğelerini düşürür; /AA, her nesneden düşürülür.

Döndürülen CdrResult, yeniden yapılandırılmış baytları, kaldırılan-tehdit listesini, her iki bayt boyutunu, kabul bayrağını ve red nedenini açığa çıkarır. Kaynağın çözülebilir bir /Root öğesi varsa ve yeniden yapılandırılmış çıktı bunu kaybettiyse, motor yapısal olarak bozuk bir dosya döndürmek yerine çıktıyı reddeder. Bu, bir fail-closed garantidir: admitted true, çıktının hâlâ bir belge kataloğu referansı taşıdığını ima eder.

Artımlı güncellemeler asla hayatta kalmaz: yeniden yapılandırma her ilke altında tam olarak bir revizyon seri hâle getirir, bu yüzden gölge tarzı geç revizyonlar yapıca düzleştirilir. Orijinal dijital imzalar bir yeniden yapılandırma boyunca geçerli kalamaz, çünkü bayt aralıkları artık çıktıyla eşleşmez.

Mimari kırmızı çizgi. CDR bir güvenlik izdüşümü katmanıdır, bir koruma katmanı değil. Çıktı; yasal kanıt korumada, orijinalle karma karşılaştırmasında ya da arşiv kopyalarında kullanılmamalıdır.

  • Bir null ilke, CdrPolicy::standard() olarak çözümlenir. Varsayılan boş removeThreatTypes ile oluşturulan bir ilke hiçbir şey algılamaz ve kaldırmaz.
  • allowUriActions true olarak ayarlandığında, durum removeThreatTypes içinde bulunsa bile UriAction kaldırmayı bastırır.
  • flattenIncrementalUpdates bu sürümde bildirimseldir: yeniden yapılandırma, bayrağı false olarak ayarlayan permissive() dahil her ilke altında tek bir revizyon üretir.
  • Şişme-oranı denetimi, sıfır olan ham akış uzunluğunu bir olarak ele alır, böylece hiçten şişen bir akış hâlâ sınırlanır. Hiçbir çözülmüş biçim tutulmadığında, ham akış uzunluğu toplam bütçeye sayılır.
  • Sayfa-sayısı kabul denetimi en iyi çabadır: bir katalog ya da sayfa ağacı okuma başarısızlığı belgeyi tek başına reddetmez. Nesne-sayısı ve sıkıştırma açma bütçeleri her zaman uygulanır.
  • Ham akış uzunluğu tamsayı /Length girdisiyle uyuşmayan bir nesne, yeniden yapılandırma zamanında atlanır (polyglot savunması). Böyle atlanan bir nesneye yapılan bir referans, kaynak nesne numarasını korur ve çıktıda çözülmeyebilir. sanitize(), algılanabilir biçimde bozuk sonuçları (eksik bir /Root) reddeder, ancak düşük düzeyli CdrRebuilder::rebuild() çağrısını doğrudan süren bir çağıran, çıktı yapısını ve referans bütünlüğünü kendisi yeniden doğrulamalıdır.
  • Kaynak fragman /ID taşıdığında, yeniden yapılandırılmış fragman orijinali değil taze üretilmiş rastgele bir /ID taşır. /Info dahil diğer fragman girdileri taşınmaz; yeniden yapılandırılmış fragman /Size, çözülebilir olduğunda /Root ve yeniden üretilen /ID öğelerini tutar.
  • Çözülmüş ad ve anahtar baytları, ayırıcılar, boşluk ve yazdırılamayan baytlar için onaltılık kaçışlarla yeniden üretilir, böylece düşmanca adlar çıktıya sözlük söz dizimi enjekte edemez.
  • Bilinen ad-değerli kümenin dışındaki sözlük anahtarları altındaki dizge değerleri, temkinli biçimde değişmez dizgeler olarak üretilir.
  • CdrPolicy::legacyThreatTypes(), gelecekteki herhangi bir enum durumunu bir Strip* durumu olarak kayıtlı olmadıkça varsayılan-kaldırılmış olarak ele alır, böylece yeni kayıplı durumlar varsayılan ilkelere sessizce giremez.
  • CDR bir kriptografik modül değildir. Tek rastgelelik kullanımı yeniden üretilen fragman /ID öğesidir. İmza doğrulaması burada kapsam dışıdır; bkz. İmza derin başvurusu.
İddiaStandartMadde
Bir ECMAScript eylemini çağırmak, bir PDF işlemcisinin gömülü betiği yürütmesine yol açar.ISO 32000-2§12.6.4.17
JavaScript ad ağacındaki belge düzeyi betiklerin tümü belge açıldığında yürütülür.ISO 32000-2§12.6.4.17
Katalog ad sözlüğü, belge düzeyi betik eylemlerinden oluşan bir JavaScript ad ağacı tutabilir.ISO 32000-2§7.7.4 (Table 32)
Bir başlatma eylemi bir uygulamayı başlatır ya da bir belgeyi açar veya yazdırır.ISO 32000-2§12.6.4.6
/AA ek-eylem sözlükleri, açıklamalardaki, sayfalardaki, alanlardaki ve katalogdaki tetikleyici olayları genişletir.ISO 32000-2§12.6.3
Güvenilmeyen dosya alımı, gelen dosyaların varlığını, hacmini ve içeriğini sınırlamalıdır.OWASP ASVS 5.0§5.2
Sistemler, yüklenen dosyaların uygunsuz yürütülmesini önlemeli ve tehlikeli içeriği algılamalıdır.OWASP ASVS 5.0§5.3

Tüm maddeler yorumlanmıştır; NextPDF normatif metni yeniden üretmez. NextPDF hiçbir sertifikasyon iddiasında bulunmaz. CDR, yapılandırılan ilke altında ThreatType tarafından sıralanan etkin-içerik yüzeylerini kaldırır; bu bir yetenektir, sertifikalı bir sanitize edici değil. CDR bir antivirüs tarayıcısı değildir ve kötü amaçlı yazılım imzalarını algılamaz; OWASP ASVS 5.4.3 antivirüs taraması gibi denetimleri tamamlar, karşılamaz. Silahsızlandırılmış bir dosyanın belirli bir alım hattı için kabul edilebilir olup olmadığı, işletmecinin risk kararı olarak kalır.

  • Modül kaynağı @since 1.9.0 taşır; bu başvuru, nextpdf/enterprise 3.1.0 ile sevk edilen yüzeyi belgeler.
  • Her şey konağınızda süreç içinde çalışır. Sanitizasyon sırasında hiçbir ağ erişimi gerçekleşmez.
  • CdrPolicy ve DetectedThreat final readonly sınıflardır; sınırları değiştirmek için yeni bir ilke örneği oluşturun.
  • CdrEngine, dedektörünü ve yeniden yapılandırıcısını dahili olarak oluşturur. ThreatDetector ve CdrRebuilder, kendi PdfReader nesnelerini sağlayan aşamalı hatlar için doğrudan kullanılabilir kalır.
  • CdrRebuilder::rebuild öğesinin $policy parametresi şu anda ayrılmıştır; kaynak, onu çağrı-yeri uyumluluğu ve gelecekteki ilke başına seri hâle getirme ayarlamaları için tutulan olarak belgeler.
  • Çıktı yapısal olarak yeniden üretilebilirdir, bit bakımından yeniden üretilebilir değildir: yeniden üretilen /ID, kaynak bir tane taşıdığında her çalıştırmada farklıdır.
  • CdrResult sonuç türü (sanitize() öğesinin dönüş değeri) yukarıda davranışsal olarak kapsanmıştır; alanları public readonly olup, kolaylık için hadThreats() ve threatCount() içerir.

Bu sayfa yalnızca dışarıdan gözlemlenebilir davranışı ve desteklenen genel API yüzeyini belgeler. Dahili ad alanı yolları, yardımcı sınıflar, mekanizma tabloları, runbook dosya adları ve bilet önekleri kapsam dışıdır.