文件權限¶
PDF 加密文件可以限制使用者對文件的操作,例如禁止列印、複製文字或修改內容。Permission 旗標(bitfield)定義了這些限制,儲存在 PDF 加密字典的 P 欄位中。
權限旗標¶
use NextPDF\Security\Permission;
use NextPDF\Security\EncryptionConfig;
// 按位元組合多個權限
$config = Configuration::create(
encryption: EncryptionConfig::aes256(
userPassword: 'user',
ownerPassword: 'owner',
permissions: Permission::PRINT
| Permission::PRINT_HIGH_QUALITY
| Permission::COPY,
),
);
完整權限旗標列表¶
| 常數 | 位元 | 說明 |
|---|---|---|
Permission::PRINT | bit 3 | 允許列印(可能是低品質) |
Permission::MODIFY | bit 4 | 允許修改文件(除表單外) |
Permission::COPY | bit 5 | 允許複製文字與圖形 |
Permission::ADD_ANNOTATIONS | bit 6 | 允許新增或修改標注 |
Permission::FILL_FORMS | bit 9 | 允許填寫表單欄位 |
Permission::EXTRACT_ACCESSIBILITY | bit 10 | 允許擷取文字(無障礙用途) |
Permission::ASSEMBLE | bit 11 | 允許文件組裝(插入/刪除/旋轉頁面) |
Permission::PRINT_HIGH_QUALITY | bit 12 | 允許高品質列印 |
Permission::NONE | 0 | 禁止所有操作 |
Permission::ALL | 全部 | 允許所有操作 |
常用權限組合¶
// 唯讀文件(可查看、可列印,不可修改)
Permission::PRINT | Permission::PRINT_HIGH_QUALITY | Permission::EXTRACT_ACCESSIBILITY
// 可填寫表單(不可修改文件結構)
Permission::FILL_FORMS | Permission::EXTRACT_ACCESSIBILITY
// 可存取(無障礙使用)
Permission::EXTRACT_ACCESSIBILITY
// 完全鎖定(只能查看)
Permission::NONE
權限的實際限制¶
需要理解的重要事項:PDF 權限是「軟性」限制,僅在符合規範的 PDF 閱讀器中執行。使用擁有者密碼可以解除所有限制,且部分第三方工具可能忽略權限設定。
對於需要強制執行的機密性保護,應考慮: 1. 使用 DRM(數位版權管理)方案 2. 限制文件的散佈渠道 3. 結合數位簽章確保完整性
密碼安全性¶
SASLprep 正規化¶
根據 PDF 2.0 規範,密碼在使用前必須經過 SASLprep(RFC 4013)正規化,確保 Unicode 密碼在不同系統間的一致性:
use NextPDF\Security\PasswordNormalizer;
// NextPDF 內部自動執行,開發者通常不需要直接呼叫
$normalized = PasswordNormalizer::saslprep($rawPassword);
// 注意:部分 Unicode 字元在 SASLprep 後可能改變或被拒絕
// 若密碼包含非 ASCII 字元,建議先驗證
$isValid = PasswordNormalizer::isValidForPdf($rawPassword);
密碼強度建議¶
最低要求(生產環境):
- 擁有者密碼:至少 16 字元,包含大小寫、數字、特殊字元
- 使用者密碼:至少 8 字元(若使用的話)
警告:
- 禁止使用空擁有者密碼(等同無保護)
- 禁止使用者密碼 = 擁有者密碼(無法區分角色)
- PDF 最大密碼長度:127 bytes(UTF-8 編碼後)