Skip to content

安全性總覽

TCPDF-Next 以安全優先的哲學進行設計。作為一套處理數位簽章、加密與機敏文件的函式庫,安全不是事後補強,而是核心架構原則。

安全優先設計

每一個元件在設計時都將安全納入考量:

1. 全面淘汰過時密碼學

TCPDF-Next 在編譯期與執行期均拒絕所有已棄用和不安全的演算法:

  • RC4 — 禁止使用(已知多種攻擊手法的破損加密法)
  • MD5 — 禁止使用(自 2004 年以來已展示碰撞攻擊)
  • SHA-1 — 拒絕用於所有簽章操作(自 2017 年以來已展示碰撞攻擊)
  • RSA 金鑰 < 2048 位元 — 拒絕(1024 位元金鑰已可被分解)
  • DES / 3DES — 未實作

2. 記憶體安全

  • 所有機敏資料(私鑰、密碼、解密內容)儲存於 SensitiveString 物件中,不再使用時自動從記憶體歸零
  • 在可用的情況下使用 PHP 的 sodium_memzero() 進行安全的記憶體清除
  • 含有機敏資料的暫存檔案會透過覆寫方式安全刪除

3. 輸入驗證

  • 所有 PDF 輸入在處理前均經過嚴格驗證
  • 畸形的 PDF 結構會被拒絕,而非以「盡力解析」方式處理
  • 所有大小計算均包含整數溢位檢查
  • 嵌入式檔案處理具備路徑遍歷防護

4. 常數時間操作

  • HMAC 驗證使用常數時間比較(hash_equals()
  • 密碼驗證使用常數時間比較
  • 密碼學操作不會產生基於計時的資訊洩漏

加密

TCPDF-Next 支援使用 AES-256 的 PDF 2.0 加密:

php
use YeeeFang\TcpdfNext\Encryption\EncryptionAlgorithm;
use YeeeFang\TcpdfNext\Encryption\Permissions;

$pdf->setEncryption()
    ->setAlgorithm(EncryptionAlgorithm::AES256)
    ->setUserPassword('reader-password')
    ->setOwnerPassword('admin-password')
    ->setPermissions(
        Permissions::PRINT_HIGH_QUALITY
        | Permissions::COPY
        | Permissions::ACCESSIBILITY
    )
    ->apply();

加密功能

功能說明
AES-256-CBC依據 PDF 2.0(Revision 6)的預設加密
公鑰加密針對多個收件者的憑證式加密
細粒度權限控制列印、複製、修改、註解、填寫表單、擷取、組合
中繼資料加密文件中繼資料可選擇性加密

WARNING

加密保護的是文件機密性,但無法保證完整性或不可否認性。如需完整性與不可否認性,請同時搭配使用數位簽章與加密。

數位簽章

TCPDF-Next 完整實作了 PAdES 基準設定檔(ETSI EN 319 142-1)的數位簽章:

等級說明驗證有效期
PAdES B-B基礎 CMS 簽章憑證有效期(約 1-3 年)
PAdES B-T+ RFC 3161 時間戳記TSA 憑證有效期(約 10-15 年)
PAdES B-LT+ DSS 含 OCSP/CRL 資料演算法安全壽命(約 15-30 年)
PAdES B-LTA+ 歸檔時間戳記無限期(搭配重新戳記)

詳細資訊請參閱 PAdES B-LTA 簽章

安全架構

┌─────────────────────────────────────────────────────┐
│                    應用程式層                         │
│           (您使用 TCPDF-Next API 的程式碼)           │
├─────────────────────────────────────────────────────┤
│                    驗證層                             │
│  • 輸入淨化          • PDF 結構驗證                    │
│  • 參數驗證          • 憑證鏈檢查                      │
├─────────────────────────────────────────────────────┤
│                   密碼學層                            │
│  • AES-256 加密      • CMS 簽章建構                   │
│  • RSA/ECDSA/EdDSA  • 雜湊計算                       │
│  • HMAC 驗證         • 金鑰衍生                       │
├─────────────────────────────────────────────────────┤
│                  核心 PDF 層                          │
│  • 物件序列化        • 串流壓縮                        │
│  • 交叉引用產生      • 增量更新                        │
├─────────────────────────────────────────────────────┤
│              PHP 執行環境與擴充套件                     │
│  • OpenSSL   • Sodium   • mbstring   • zlib          │
└─────────────────────────────────────────────────────┘

相依性安全

TCPDF-Next 將外部相依性降至最低,以縮小攻擊面:

  • 零執行期相依 — 核心 PDF 產生不依賴任何第三方 Composer 套件
  • OpenSSL 擴充 — 密碼學操作所需(使用 PHP 內建綁定)
  • Sodium 擴充 — 選用,用於安全記憶體清除及 Ed25519/Ed448(PHP 8.5+ 已內建)
  • zlib 擴充 — 串流壓縮所需(PHP 已內建)
  • mbstring 擴充 — Unicode 文字處理所需(PHP 已內建)

TIP

TCPDF-Next 刻意避免依賴外部 PHP 密碼學函式庫。所有密碼學操作均使用 PHP 內建的 OpenSSL 與 Sodium 擴充套件,它們是經過充分審計之 C 函式庫的薄封裝。

負責任揭露政策

我們嚴肅對待安全漏洞。若您發現 TCPDF-Next 的安全問題,請依照以下負責任揭露流程進行:

回報漏洞

  1. 請勿在公開的 GitHub Issue 中回報安全漏洞
  2. 電子郵件:[email protected](PGP 金鑰如下)
  3. 請包含:
    • 漏洞描述
    • 重現步驟
    • 潛在影響評估
    • 建議修復方式(如有)

回應時程

階段時程
確認收到24 小時內
初步評估72 小時內
修復開發14 天內(重大)、30 天內(高)
公開揭露回報後 90 天,或修復釋出時

安全設定

建議的 php.ini 設定

ini
; 確保載入 OpenSSL
extension=openssl

; 確保載入 Sodium(PHP 8.5+ 已內建)
extension=sodium

; 停用 PDF 產生不需要的危險函式
disable_functions = exec,passthru,shell_exec,system,proc_open,popen

; 為 PDF 產生設定合理的記憶體限制
memory_limit = 256M

; 若接受 PDF 上傳,設定合理的檔案大小限制
upload_max_filesize = 50M
post_max_size = 50M

TCPDF-Next 安全組態

php
use YeeeFang\TcpdfNext\Security\SecurityConfig;

SecurityConfig::global()
    ->setMinRsaKeySize(2048)
    ->setMinEcKeySize(256)
    ->setRejectSha1(true)
    ->setRejectRc4(true)
    ->setSecureMemoryWipe(true)
    ->setStrictPdfParsing(true)
    ->setMaxPdfFileSize(100 * 1024 * 1024) // 100 MB
    ->setMaxEmbeddedFileSize(50 * 1024 * 1024); // 50 MB

安全文件

以 LGPL-3.0-or-later 授權釋出。