ความปลอดภัยและการดำเนินงานสำหรับ NextPDF Symfony
ภาพรวมโดยสรุป
หัวข้อที่มีชื่อว่า “ภาพรวมโดยสรุป”ตัวช่วยจัดการการตอบสนองใช้ชุดส่วนหัวความปลอดภัยแบบตายตัว ออบเจกต์ถ่ายโอนข้อมูล (DTO) ของข้อความแบบอะซิงโครนัสตรวจสอบความถูกต้องของพาธเอาต์พุตสองครั้ง การลงนามเป็นแบบเลือกได้ และเมื่อใช้กับระดับ Pro จะจำกัดอยู่ที่โปรไฟล์เบสไลน์ที่ระบุไว้ในเอกสารนี้
ส่วนหัวความปลอดภัยของการตอบสนอง HTTP
หัวข้อที่มีชื่อว่า “ส่วนหัวความปลอดภัยของการตอบสนอง HTTP”NextPDF\Symfony\Http\PdfResponse ใช้ชุดส่วนหัวเดียวกันกับการตอบสนองที่สร้างขึ้นทุกรายการ ทั้งแบบอินไลน์ แบบดาวน์โหลด และทั้งสองรูปแบบที่สตรีม ค่าคงที่ในซอร์สโค้ดยืนยันส่วนหัวเหล่านี้ไว้อย่างชัดเจน:
| ส่วนหัว | ค่า |
|---|---|
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 |
ส่วนหัวเหล่านี้ช่วยลดการเดา content-type การฝังเฟรม การจัดทำดัชนี และการรั่วไหลของ referrer สำหรับเอกสารที่สร้างขึ้น รูปแบบที่ใช้บัฟเฟอร์ยังตั้งค่า Content-Type: application/pdf และ Content-Length ด้วย ส่วนรูปแบบที่สตรีมจะตั้งค่าชนิดเนื้อหาและละเว้น Content-Length โดยเจตนา
บันเดิลกำหนดชุดส่วนหัวนี้ไว้ตายตัว หากต้องการเพิ่มหรือเปลี่ยนแปลงส่วนหัว เช่น Cache-Control ที่เข้มงวดยิ่งขึ้นสำหรับการดาวน์โหลดที่ผ่านการตรวจสอบสิทธิ์ ให้แก้ไข Response ที่ส่งคืนในคอนโทรลเลอร์ของคุณก่อนส่งคืน
การจัดการ Content-Disposition และชื่อไฟล์
หัวข้อที่มีชื่อว่า “การจัดการ Content-Disposition และชื่อไฟล์”PdfResponse สร้างส่วนหัว Content-Disposition อย่างระมัดระวัง PdfResponseTest ยืนยันพฤติกรรมนี้:
- ชื่อไฟล์จะถูกทำให้ปลอดภัย ตัวคั่นพาธและลำดับการเคลื่อนผ่านพาธจะถูกตัดออก ดังนั้นชื่อไฟล์อย่าง
../../../etc/passwd.pdfจึงไม่สามารถหลุดออกไปได้ - ระบบจะต่อท้ายนามสกุล
.pdfเมื่อยังไม่มี ส่วนนามสกุลที่มีอยู่แล้วจะไม่ถูกทำซ้ำ รวมถึง.PDFแบบตัวพิมพ์ใหญ่ - เครื่องหมายอัญประกาศคู่และแบ็กสแลชจะถูก escape สำหรับรูปแบบสตริงในเครื่องหมายอัญประกาศ
- ชื่อไฟล์ที่ไม่ใช่ ASCII จะได้รับทั้งค่าสำรองแบบ ASCII และ รูปแบบ
filename*=UTF-8''ตาม RFC-5987 (Request for Comments 5987) - ชื่อไฟล์ที่ว่างเปล่าจะเปลี่ยนไปใช้ค่า
document.pdfแทน
ส่งชื่อไฟล์ที่ได้รับอิทธิพลจากผู้ใช้ก็ต่อเมื่อผ่านการตรวจสอบสิทธิ์ในระดับแอปพลิเคชันของคุณแล้วเท่านั้น บันเดิลทำให้ข้อมูลปลอดภัยเพื่อความปลอดภัยของส่วนหัว ไม่ใช่เพื่อการควบคุมการเข้าถึง
การตรวจสอบความถูกต้องของพาธเอาต์พุตแบบอะซิงโครนัส
หัวข้อที่มีชื่อว่า “การตรวจสอบความถูกต้องของพาธเอาต์พุตแบบอะซิงโครนัส”NextPDF\Symfony\Message\GeneratePdfMessage ตรวจสอบความถูกต้องของพาธเอาต์พุตในคอนสตรักเตอร์ NextPDF\Symfony\Message\GeneratePdfHandler ตรวจสอบความถูกต้องอีกครั้งขณะทำงานก่อนเขียน การสร้างจะปฏิเสธ:
- พาธที่ว่างเปล่า หรือพาธที่มี null byte;
- สคีมา stream-wrapper อย่างเช่น
php://...; - เซกเมนต์การเคลื่อนผ่านพาธ
..ที่ใช้ตัวคั่น/หรือ\; - พาธที่ไม่ลงท้ายด้วย
.pdf(ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก); - ค่า
builderClassที่ไม่ใช่ชื่อคลาสที่ถูกต้องตามไวยากรณ์
การตรวจสอบความถูกต้องครั้งที่สองในตัวจัดการมีความสำคัญ เพราะข้อความอาจค้างอยู่ในคิวระหว่างการส่งและการประมวลผล ตัวจัดการไม่เชื่อถือพาธที่อยู่ในคิวและจะใช้ตัวป้องกันพาธอีกครั้งก่อนบันทึก เรียกใช้เวิร์กเกอร์ภายใต้บัญชีระบบไฟล์ที่มีสิทธิ์ต่ำสุดและจำกัดขอบเขตไว้ที่ไดเรกทอรีเอาต์พุตที่ตั้งใจไว้
ขอบเขตการแก้ไขชื่อบิลเดอร์
หัวข้อที่มีชื่อว่า “ขอบเขตการแก้ไขชื่อบิลเดอร์”GeneratePdfHandler แก้ไขชื่อบิลเดอร์จากตัวระบุตำแหน่งบริการ PHP Standard Recommendation 11 (PSR-11) ที่ใช้ชื่อคลาสเป็นคีย์ และปฏิเสธสิ่งใดก็ตามที่ไม่ใช่ PdfBuilderInterface เนื่องจากตัวระบุตำแหน่งเปิดเผยเฉพาะบิลเดอร์ที่ลงทะเบียนไว้เท่านั้น builderClass ที่ผู้โจมตีควบคุมในเพย์โหลดการขนส่งที่ถูกดัดแปลงจึงไม่สามารถสร้างอินสแตนซ์ของคลาสใดก็ได้ ภายใต้ PSR-11 เมื่อคอนเทนเนอร์รายงานว่าไม่มี id การแก้ไขชื่อจะล้มเหลวแทนที่จะส่งคืนสิ่งที่ไม่คาดคิดอย่างเงียบ ๆ (PSR-11 §1.1.2) ลงทะเบียนเฉพาะคลาสบิลเดอร์ที่เชื่อถือได้ในตัวระบุตำแหน่งเท่านั้น
แนวทางการลงนามดิจิทัลแบบเลือกได้
หัวข้อที่มีชื่อว่า “แนวทางการลงนามดิจิทัลแบบเลือกได้”การลงนามดิจิทัล ไม่ใช่ ส่วนหนึ่งของบันเดิลหลัก ระบบจะเปิดใช้งานก็ต่อเมื่อมี nextpdf/premium (ซึ่งติดตั้งระดับ Pro) และ compiler pass ตรวจพบคลาสการลงนามของ Pro เมื่อติดตั้งบันเดิลและระดับ Pro แล้ว การกำหนดค่าการลงนามที่รองรับและระบุไว้ในเอกสารคือโปรไฟล์ เบสไลน์ B-B
โหนดการกำหนดค่า signature.level ยอมรับค่าสตริงเพิ่มเติมเพื่อให้สคีมาเข้ากันได้ภายในตระกูลการกำหนดค่าของ NextPDF ความสามารถในการลงนามที่บันเดิลนี้จัดส่งและรองรับคือ B-B เอกสารของ NextPDF Premium ครอบคลุมโปรไฟล์การลงนามนอกเหนือจาก B-B ข้อกำหนดของโปรไฟล์เหล่านั้น และข้อพิจารณาด้านการดำเนินงาน เนื้อหาเหล่านั้นไม่ได้อธิบายไว้ในที่นี้โดยเจตนา
หมายเหตุด้านการดำเนินงานสำหรับเส้นทางการลงนาม B-B:
- ตัวลงนามจะลงทะเบียน เฉพาะ เมื่อ
signature.enabledเป็น true และ มีการตั้งค่าsignature.certificateมิเช่นนั้นส่วนนี้จะไม่ทำงาน - จัดเตรียมใบรับรอง คีย์ส่วนตัว และรหัสผ่านผ่าน Symfony secrets หรือตัวแปรสภาพแวดล้อม อย่าคอมมิตสิ่งเหล่านี้ลงในรีโพซิทอรีโดยเด็ดขาด
- จำกัดสิทธิ์การอ่านข้อมูลคีย์ไว้เฉพาะบัญชีของแอปพลิเคชัน
การบันทึกล็อกแบบเลือกได้
หัวข้อที่มีชื่อว่า “การบันทึกล็อกแบบเลือกได้”รีจิสทรีของฟอนต์และรูปภาพยอมรับ Psr\Log\LoggerInterface แบบเลือกได้ที่ผูกกับ nullOnInvalid() เมื่อมีอยู่ จะเป็นตัวทำงานร่วมที่สลับเปลี่ยนได้ภายใต้สัญญาตัวบันทึกล็อก PHP Standard Recommendation 3 (PSR-3) (PSR-3) ลบข้อมูลที่ระบุตัวตนของผู้ใช้ออกจากบริบทล็อกใด ๆ ที่คุณเพิ่มรอบการสร้างเอกสาร บันเดิลไม่บันทึกล็อกเนื้อหาของเอกสาร
รายการตรวจสอบการเสริมความแข็งแกร่งด้านการดำเนินงาน
หัวข้อที่มีชื่อว่า “รายการตรวจสอบการเสริมความแข็งแกร่งด้านการดำเนินงาน”- คงส่วนหัวการตอบสนองแบบตายตัวไว้ และเพิ่มชั้นการแคชที่เข้มงวดยิ่งขึ้นสำหรับการดาวน์โหลดที่ผ่านการตรวจสอบสิทธิ์ที่คอนโทรลเลอร์
- ตรวจสอบสิทธิ์ของคำขอก่อนสร้างหรือส่งคืนเอกสาร บันเดิลไม่ดำเนินการควบคุมการเข้าถึง
- จัดเก็บข้อมูลคีย์สำหรับการลงนามไว้ใน Symfony secrets / ตัวแปรสภาพแวดล้อม พร้อมสิทธิ์ของไฟล์แบบสิทธิ์ต่ำสุด
- เรียกใช้เวิร์กเกอร์ของ Messenger ภายใต้บัญชีที่มีสิทธิ์ต่ำสุดซึ่งจำกัดสิทธิ์การเขียนไว้ที่ไดเรกทอรีเอาต์พุตเท่านั้น
- เปิดใช้งาน
ext-mbstringและext-zlibไว้เสมอ (มิเช่นนั้นบันเดิลจะล้มเหลวทันที) - ปักหมุดเวอร์ชันหลักของ
nextpdf/coreเพียงเวอร์ชันเดียวในแอปพลิเคชัน เพื่อให้เวอร์ชันของเอนจินคงที่ตลอดการปรับใช้งาน
ความสอดคล้อง
หัวข้อที่มีชื่อว่า “ความสอดคล้อง”แต่ละแถวคือข้อกล่าวอ้างเชิงบรรทัดฐานที่ระบุไว้ในหน้านี้ ซึ่งปักหมุดไว้กับ reference_id แบบ 64-hex เต็มจากคลังข้อมูลขององค์กรพัฒนามาตรฐาน (SDO) ที่มีการควบคุมการเข้าถึง ที่มา (มานิเฟสต์ของคลังข้อมูล การขนส่งสำหรับการดึงข้อมูล) อยู่ใน _sidecars/rag-citations.yaml
| ข้อกำหนด | ข้อ | รหัสอ้างอิง (reference_id) | ข้อกล่าวอ้าง |
|---|---|---|---|
| PSR-11 | psr_11_container#1.1.2.p5 | has() ที่เป็น false หมายความว่า get() จะโยน NotFoundException | |
| PSR-3 | psr_3_logger#x3.p17 | ตัวทำงานร่วมตัวบันทึกล็อกแบบเลือกได้ |
บริบทเชิงพาณิชย์
หัวข้อที่มีชื่อว่า “บริบทเชิงพาณิชย์”การลงนามดิจิทัลจะใช้งานได้ก็ต่อเมื่อติดตั้ง nextpdf/premium (Pro) แล้วเท่านั้น โปรไฟล์ที่บันเดิลนี้จัดส่งคือเบสไลน์ B-B ความสามารถของ Pro แบบเลือกได้นี้ไม่จำเป็นต้องเปลี่ยนแปลงโค้ดในบันเดิล Core ที่ระบุไว้ในเอกสารนี้ ดู </get-license/?intent=symfony-pro>
ดูเพิ่มเติม
หัวข้อที่มีชื่อว่า “ดูเพิ่มเติม”- /integrations/symfony/production-usage/ — ความปลอดภัยของเวิร์กเกอร์และการสตรีม
- /integrations/symfony/configuration/ — ตาราง signature, tsa และ service
- /integrations/symfony/troubleshooting/ — การวินิจฉัยปัญหาการลงนามและ Messenger
- /integrations/symfony/integration/ — เอกสารอ้างอิงการเชื่อมต่อแบบครบวงจร