İçeriğe geç

compat-legacy için güvenlik ve operasyonlar

Bağdaştırıcı, NextPDF motorunun güvenlik modelini kullanır ve eski TCPDF 6.2.13 sürümüne kıyasla bilinçli birkaç sıkılaştırma uygular. Bu sayfa, abartıya kaçmadan nelerin kullanılabilir, nelerin kullanılamaz olduğunu tam olarak açıklar. İmzalama bölümünü dikkatle okuyun; kapsam özellikle dar tutulmuştur.

Bağdaştırıcı, güvenliği artırmak için üç tarihsel TCPDF 6.2.13 davranışını değiştirir. Bunlar güvensiz eski biçimlerine geri dönecek şekilde yapılandırılamaz:

KonuEski TCPDF 6.2.13Bağdaştırıcı
Hata işlemeError(), die() çağırarak süreci sonlandırırError(), RuntimeException fırlatır; çağıranlar başarısızlığı gözlemleyip yakalayabilir, süreç sessizce sonlandırılmaz.
HTML yürütmeBir kaçış yolu, işaretleme içinden PHP çalıştırabilirdiBu sabit K_TCPDF_CALLS_IN_HTML, false değerine sabitlenmiştir; işaretleme PHP yürütmesini tetikleyemez.
Doğrudan çıktıOutput() etkin çıktı arabelleğine yazarÇıktı, güvenli bir hedef köprüsü üzerinden geçirilir ve çağıranın denetlediği bir çıktı arabelleğini kirletmez.

Hata işleme değişikliği, bir başarısızlığı süreç sonlandırması sırasında kaybetmek yerine gözlemleyebilmenizi sağlar. Open Worldwide Application Security Project (OWASP) Application Security Verification Standard (ASVS) 5.0 §16.5.3, bir uygulamanın zarif ve güvenli biçimde başarısız olması ve fail-open durumlarını engellemesi gerektiğini belirtir. Sonlandırmak yerine istisna fırlatma değişikliği bu ilkeyi uygular. HTML sıkılaştırması, bir kod yürütme noktasını kaldırır. Eski davranışa dayanan eski kodu, /integrations/tcpdf-compat/migration/ kapsamında düzeltilmesi gereken bir kusur olarak ele alın. Sabitlenmiş madde özeti, sayfanın ön bilgisindeki citations alanındadır.

Bağdaştırıcı, TCPDF’nin SetProtection() metodunu kullanıma açar ve NextPDF motorunun standart güvenlik işleyicisine devreder.

  • Standart işleyici AES-256 kullanır. Eski $mode parametresi, metot imzası uyumluluğu için kabul edilir ve yok sayılır; bu metot aracılığıyla daha zayıf bir şifre seçmenin bir yolu yoktur. Katı (strict) mod açık olduğunda, varsayılan olmayan bir $mode kullanımı istisna fırlatır; böylece geçişin bunu açıkça ele alması zorunlu olur (tests/Unit/Compat/Tcpdf/TcpdfStrictModeTest.php içinde doğrulanır).
  • Bir sahip parolası sağlanmazsa, bağdaştırıcı kullanıcı parolasını yeniden kullanmak yerine kriptografik olarak güçlü, rastgele bir sahip parolası üretir. Bu, kullanıcı düzeyinde erişimi olanların belge üzerinde sahip düzeyinde denetim elde etmesini önler.
  • Sertifika tabanlı (açık anahtarlı) şifreleme yapılmaz; bu, SetProtection() aracılığıyla gerçekleştirilmez ve bağdaştırıcı bu metodun $pubkeys parametresini yok sayar. Bağdaştırıcıda açılan modern açık anahtarlı şifreleme giriş noktasını (setPublicKeyEncryption()) kullanın; bu giriş noktası motora devreder.

Şifreleme davranışı, ISO 32000-2 §7’de açıklanan standart güvenlik işleyicisini yansıtır. Bu madde, motorun kullandığı şifreleme sözlüğü girdilerini ve AES-256 standart işleyicisini tanımlar. Bu belgeler, çıktının “varsayılan olarak güvenli” veya “kurcalanamaz” olduğunu iddia etmez. Yalnızca kullanılan şifreyi ve kodun uyguladığı sahip parolası davranışını belirtir. Sabitlenmiş madde özeti, sayfanın ön bilgisindeki citations alanındadır.

examples/security-encryption.php
<?php
declare(strict_types=1);
require __DIR__ . '/vendor/autoload.php';
use NextPDF\Compat\Tcpdf\TCPDF;
$pdf = new TCPDF();
$pdf->AddPage();
$pdf->SetFont('helvetica', '', 12);
$pdf->Cell(0, 10, 'Encrypted document');
// User password set; owner password auto-generated (strong, random).
$pdf->SetProtection([], 'user-secret');
$pdf->Output(__DIR__ . '/encrypted.pdf', 'F');

Bu bölümü çok dikkatli okuyun. Bilerek ihtiyatlı tutulmuştur.

  • TCPDF’nin eski setSignature() ve addEmptySignatureAppearance() metotları, çekirdek motor üzerindeki bu bağdaştırıcıda uygulanmamıştır. Varsayılan modda hiçbir şey yapmazlar. Katı modda TcpdfNotImplementedException fırlatırlar.
  • Dijital imzalama, bu bağdaştırıcı aracılığıyla çekirdek dağıtımın bir yeteneği değildir. Temel (baseline) imza desteği, ticari bir NextPDF sürümü gerektirir.
  • Ticari bir sürüm mevcutsa, bağdaştırıcı motora devreden modern bir imza giriş noktası (setSignatureV2()) açar. Varsayılan profil temel (B-B) profilidir.
  • Bu belgeler, herhangi bir sürümün bu bağdaştırıcı aracılığıyla zaman damgalı, uzun vadeli doğrulama içeren veya arşivsel imza profilleri ürettiğine dair hiçbir iddiada bulunmaz. Özellikle, B-T, B-LT veya B-LTA davranışı olduğunu ileri sürmez. PDF Advanced Electronic Signatures (PAdES) temel belirtimi §6.1, dört farklı temel düzey tanımlar: B-B, B-T, B-LT ve B-LTA. Her birinin kendi gereksinimleri vardır. B-B temel düzeydir ve daha üst düzeyler (zaman damgası, uzun vadeli, arşivsel) ayrı, daha talepkâr profillerdir. Bu uyumluluk katmanının belgelendirmesi için yalnızca B-B temeli kapsam içindedir. Daha üst düzeyler açıkça kapsam dışıdır ve burada hiçbir sürüm için iddia edilmez. Sabitlenmiş madde özeti, sayfanın ön bilgisindeki citations alanındadır.
  • Bu belgeler hiçbir yerde “sertifikalı”, “garantili”, “yasal olarak geçerli” veya “eIDAS-nitelikli” imza iddiasında bulunmaz. İmzalama doğruluğu, güven çıpası politikası ve yasal geçerlilik, bu uyumluluk katmanının değil, imzalamayı yapan sürümün ve çağıranın Public Key Infrastructure (PKI)‘sının sorumluluğundadır.

Geçişiniz imzalama gerektiriyorsa, bunu ayrı bir iş kolu olarak ele alın: ticari bir sürümde modern imza application programming interface (API)‘sini benimseyin ve elde edilen imzayı bağımsız bir doğrulayıcıyla doğrulayın. TCPDF’nin setSignature() çağrısına güvenmeyin; burada bir no-op’tur.

Eski setTimeStamp() metodu, metot imzası uyumluluğu için kabul edilir ve bir uyarı üretir; bu bağdaştırıcı aracılığıyla zaman damgalı bir imza üretmez.

Yapıcının pdfa bayrağı, metot imzası uyumluluğu için kabul edilir. PDF/A arşivsel uyumluluğu, ticari bir NextPDF sürümü gerektirir. Bağdaştırıcı, motora devreden enablePdfA() metodunu kullanıma açar ve gerekli sürüm yoksa motor, uygulanabilir bir yapılandırma hatası döndürür. Bağdaştırıcı, PDF/A iddiasında bulunurken sessizce uyumsuz bir dosya üretmez.

Çıktı her zaman PDF 2.0’dır (ISO 32000-2). ISO 32000-2 §7.5.2, uyumlu bir yazma aracının belge sürümünü 2.0 olarak tanımladığını ve kaydetme sırasında bunu daha eski bir sürüme düşürmediğini belirtir. Bu nedenle, setPDFVersion() daha eski bir sürümü hedefe alamaz (bkz. /integrations/tcpdf-compat/method-coverage/ §4). Sabitlenmiş madde özeti, sayfanın ön bilgisindeki citations alanındadır.

  • Süreç sonlandırması yok. Error(), die() çağırmak yerine istisna fırlattığı için, işleme giriş noktalarını try/catch içine sarın ve başarısızlıkları uygulamanızın hata sözleşmesine eşleyin. İşleme başarısız olduğunda isteğin sonlandırılacağını varsaymayın.
  • Çıktı arabelleği güvenliği. Output(), S ile bayt döndürür; F ile bir dosya yazar; E ile base64 bir Multipurpose Internet Mail Extensions (MIME) gövdesi döndürür; I/D ile motor çıktı yolu üzerinden yönlendirir. İşçilerde ve Hypertext Transfer Protocol (HTTP) işleyicilerinde yanıtı kendiniz denetleyebilmek için S veya F tercih edin; bkz. /integrations/tcpdf-compat/production-usage/.
  • Katı mod bir üretim ayarı değildir. Bunu bir continuous integration (CI) veya denetim işiyle sınırlı tutun. Bir üretim işleme yolunda oluşan istisna, sessizce zayıflatılan bir parametreden daha kötüdür.
  • Sabit hijyeni. PDF_* / K_* sabitlerini ilk bağdaştırıcı yapımından önce tanımlayın. Sıkılaştırılmış iki bayrak (K_TCPDF_CALLS_IN_HTML, K_TCPDF_THROW_EXCEPTION_ERROR) gevşetilemez; onları gevşetmeye çalışmayın.
  • Rastgele sahip parolaları. Belirli (deterministik) bir sahip parolasına güveniyorsanız, onu açıkça ayarlayın. Aksi takdirde, belge başına güçlü ve rastgele bir parola üretilir ve bu geri kazanılamaz.
  • Söz konusu Görüntü metotları için, bağdaştırıcı herhangi bir dosya sistemi okumasından önce bir akış sarmalayıcı (stream-wrapper) yolunu reddeder. Görüntü türü algılama (TcpdfImages::getImageFileType), her scheme:// yolunu — phar://, php:// ve diğer PHP akış sarmalayıcıları dahil — bir sarmalayıcı olarak ele alır ve file_get_contents / getimagesize denetimini atlayarak yalnızca uzantıya dayalı çıkarıma geri döner. Bu, PHP 7.4 geriye-port hedefinde bir phar meta verisi ters serileştirme (deserialization) vektörünü kapatır; motor, sarmalayıcı yolu gömme işlemini kendisi reddeder.
  • Bağdaştırıcı, görüntü veya çıktı metotlarına geçirilen dosya yolları için motorun yaptığının ötesinde bir yol doğrulaması veya temizliği eklemez. Çağıran tarafından sağlanan yolları ve URL’leri, uygulama sınırınızda güvenilmez olarak ele alın.
  • HTML metotlarına geçirilen HTML, bir TCPDF HTML çözümleyicisi tarafından değil, motor tarafından işlenir. Eski PHP yürütme noktası kapatılmıştır, ancak yine de çağıran tarafından sağlanan HTML’i güvenilmez girdi olarak ele almalısınız.
  • Şifreleme, standart işleyici altında belgenin durağan haldeki gizliliğini korur. Bu, uygulamanızdaki aktarım güvenliğinin veya erişim denetiminin yerine geçmez.
  • /integrations/tcpdf-compat/method-coverage/ — şu metotların tam davranışı: SetProtection(), setSignature()
  • /integrations/tcpdf-compat/configuration/ — iki sıkılaştırılmış, yapılandırılamaz bayrak
  • /integrations/tcpdf-compat/production-usage/ — işçiler, arabellekler, başarısızlık işleme
  • docs/TCPDF_COVERAGE.md — otoritatif kapsam matrisi
  • Paket NOTICE — bağımsız uygulama beyanı