Bảo mật và vận hành NextPDF Symfony
Tổng quan nhanh
Phần tiêu đề “Tổng quan nhanh”Các helper tạo phản hồi áp dụng một bộ header bảo mật cố định. Đối tượng truyền dữ liệu (DTO) của message bất đồng bộ xác thực đường dẫn đầu ra hai lần. Việc ký là tùy chọn; ở bậc Pro, tính năng này được giới hạn trong hồ sơ baseline được mô tả tại đây.
Các header bảo mật của phản hồi HTTP
Phần tiêu đề “Các header bảo mật của phản hồi HTTP”NextPDF\Symfony\Http\PdfResponse áp dụng cùng một bộ header cho mọi phản hồi mà nó tạo: inline, tải xuống và cả hai biến thể truyền luồng. Hằng số trong mã nguồn xác nhận chính xác các header này:
| Header | Giá trị |
|---|---|
Cache-Control | private, max-age=0, must-revalidate |
Pragma | public |
X-Content-Type-Options | nosniff |
X-Frame-Options | DENY |
Content-Security-Policy | default-src 'none' |
X-Robots-Tag | noindex, nofollow |
Referrer-Policy | no-referrer |
Những header này giảm nguy cơ dò content-type, nhúng khung, lập chỉ mục và rò rỉ referrer đối với các tài liệu được tạo. Các biến thể có vùng đệm cũng đặt Content-Type: application/pdf và Content-Length. Các biến thể truyền luồng đặt content type và chủ ý bỏ qua Content-Length.
Bundle cố định bộ header này. Để thêm hoặc thay đổi header, chẳng hạn dùng Cache-Control chặt chẽ hơn cho các lượt tải xuống đã xác thực, hãy sửa Response được controller trả về trước khi trả nó về.
Content-Disposition và xử lý tên tệp
Phần tiêu đề “Content-Disposition và xử lý tên tệp”PdfResponse dựng header Content-Disposition theo hướng phòng vệ. PdfResponseTest xác minh hành vi này:
- Tên tệp được làm sạch; các dấu phân cách đường dẫn và chuỗi duyệt ngược bị loại bỏ, nên một tên tệp như
../../../etc/passwd.pdfkhông thể thoát ra ngoài. - Phần mở rộng
.pdfđược thêm vào khi thiếu; phần mở rộng đã tồn tại không bị nhân đôi, kể cả.PDFviết hoa. - Dấu ngoặc kép và dấu gạch chéo ngược được escape cho dạng chuỗi đặt trong ngoặc kép.
- Các tên tệp không phải ASCII nhận một bản dự phòng ASCII và một biến thể
filename*=UTF-8''theo RFC-5987 (Request for Comments 5987). - Tên tệp trống sẽ dự phòng về
document.pdf.
Chỉ truyền vào tên tệp chịu ảnh hưởng của người dùng sau khi đã kiểm tra quyền ở cấp ứng dụng của bạn. Bundle làm sạch để bảo vệ header, không phải để kiểm soát truy cập.
Xác thực đường dẫn đầu ra bất đồng bộ
Phần tiêu đề “Xác thực đường dẫn đầu ra bất đồng bộ”NextPDF\Symfony\Message\GeneratePdfMessage xác thực đường dẫn đầu ra trong constructor của nó. NextPDF\Symfony\Message\GeneratePdfHandler xác thực lại đường dẫn này tại thời điểm thực thi trước khi ghi. Quá trình khởi tạo sẽ từ chối:
- đường dẫn trống, hoặc đường dẫn chứa null byte;
- scheme stream-wrapper như
php://...; - đoạn duyệt ngược
..dùng dấu phân cách/hoặc\; - một đường dẫn không kết thúc bằng
.pdf(không phân biệt chữ hoa chữ thường); - một
builderClasskhông phải là tên lớp hợp lệ về cú pháp.
Lần xác thực thứ hai trong handler rất quan trọng vì một message có thể nằm trong hàng đợi từ lúc gửi đến lúc được tiêu thụ. Handler không tin tưởng đường dẫn đã xếp hàng và áp dụng lại cơ chế bảo vệ đường dẫn trước khi lưu. Hãy chạy worker dưới một tài khoản hệ thống tệp có đặc quyền tối thiểu, chỉ giới hạn trong thư mục đầu ra dự kiến.
Ranh giới phân giải builder
Phần tiêu đề “Ranh giới phân giải builder”GeneratePdfHandler phân giải builder từ một service locator PHP Standard Recommendation 11 (PSR-11) được lập chỉ mục theo tên lớp và từ chối bất kỳ thứ gì không phải là PdfBuilderInterface. Vì locator chỉ phơi bày các builder đã đăng ký, một builderClass do kẻ tấn công kiểm soát trong payload transport bị giả mạo không thể khởi tạo một lớp tùy ý. Theo PSR-11, khi một container báo cáo rằng một id vắng mặt, việc phân giải id đó sẽ thất bại thay vì âm thầm trả về thứ ngoài dự kiến (PSR-11 §1.1.2). Chỉ đăng ký các lớp builder đáng tin cậy trong locator.
Tư thế ký số tùy chọn
Phần tiêu đề “Tư thế ký số tùy chọn”Việc ký số không thuộc bundle core. Nó chỉ kích hoạt khi nextpdf/premium (gói cài đặt bậc Pro) có mặt và compiler pass phát hiện các lớp ký Pro. Khi đã cài đặt bundle và bậc Pro, cấu hình ký được hỗ trợ và được mô tả là hồ sơ baseline B-B.
Nút cấu hình signature.level chấp nhận thêm các giá trị chuỗi để tương thích schema trên toàn bộ họ cấu hình NextPDF. Khả năng ký được bundle này cung cấp và hỗ trợ là B-B. Tài liệu NextPDF Premium đề cập đến các hồ sơ ký vượt ngoài B-B, yêu cầu của chúng và các cân nhắc khi vận hành. Các nội dung đó được cố ý không mô tả tại đây.
Ghi chú vận hành cho đường ký B-B:
- Signer chỉ được đăng ký khi
signature.enabledlà true vàsignature.certificateđược đặt; nếu không, phần này sẽ không hoạt động. - Hãy cung cấp certificate, private key và mật khẩu qua Symfony secrets hoặc biến môi trường. Đừng bao giờ commit các thông tin này vào repository.
- Hãy giới hạn quyền đọc vật liệu khóa chỉ cho tài khoản ứng dụng.
Ghi log tùy chọn
Phần tiêu đề “Ghi log tùy chọn”Các registry phông chữ và hình ảnh chấp nhận một Psr\Log\LoggerInterface tùy chọn, được ràng buộc bằng nullOnInvalid(). Khi có mặt, nó là một collaborator có thể thay thế theo hợp đồng logger PHP Standard Recommendation 3 (PSR-3) (PSR-3). Hãy loại bỏ dữ liệu định danh người dùng khỏi mọi log context mà bạn thêm vào quanh quá trình tạo tài liệu; bundle không ghi log nội dung tài liệu.
Danh sách kiểm tra tăng cường vận hành
Phần tiêu đề “Danh sách kiểm tra tăng cường vận hành”- Hãy giữ các header phản hồi cố định; bổ sung cơ chế cache chặt chẽ hơn cho các lượt tải xuống đã xác thực trong controller.
- Hãy phân quyền cho yêu cầu trước khi tạo hoặc trả về tài liệu; bundle không thực hiện kiểm soát truy cập.
- Hãy lưu trữ vật liệu khóa ký trong Symfony secrets / biến môi trường với quyền tệp đặc quyền tối thiểu.
- Hãy chạy các worker Messenger dưới một tài khoản đặc quyền tối thiểu với quyền ghi giới hạn trong thư mục đầu ra.
- Hãy giữ
ext-mbstringvàext-zlibđược bật (nếu không bundle sẽ thất bại ngay lập tức). - Hãy ghim một phiên bản major
nextpdf/coreduy nhất trong ứng dụng để phiên bản engine nhất quán qua các lần triển khai.
Tuân thủ
Phần tiêu đề “Tuân thủ”Mỗi hàng là một tuyên bố quy chuẩn được nêu trên trang này, được ghim bằng một reference_id 64 ký tự hex đầy đủ từ kho ngữ liệu được kiểm soát truy cập của tổ chức phát triển tiêu chuẩn (SDO). Nguồn gốc (manifest kho ngữ liệu, transport truy xuất) nằm trong _sidecars/rag-citations.yaml.
| Đặc tả | Điều khoản | reference_id | Tuyên bố |
|---|---|---|---|
| PSR-11 | psr_11_container#1.1.2.p5 | has() trả về false hàm ý get() ném ra NotFoundException | |
| PSR-3 | psr_3_logger#x3.p17 | Collaborator logger tùy chọn |
Bối cảnh thương mại
Phần tiêu đề “Bối cảnh thương mại”Việc ký số chỉ khả dụng khi nextpdf/premium (Pro) được cài đặt; hồ sơ được cung cấp của bundle này là baseline B-B. Khả năng Pro tùy chọn này không cần thay đổi mã trong bundle Core được mô tả tại đây. Xem </get-license/?intent=symfony-pro>.
Xem thêm
Phần tiêu đề “Xem thêm”- /integrations/symfony/production-usage/ — an toàn worker và truyền luồng.
- /integrations/symfony/configuration/ — các bảng signature, tsa và service.
- /integrations/symfony/troubleshooting/ — chẩn đoán các vấn đề về ký và Messenger.
- /integrations/symfony/integration/ — tài liệu tham khảo nối dây đầu cuối.