ข้ามไปยังเนื้อหา

ความปลอดภัยและการดำเนินงานสำหรับ NextPDF Symfony

ตัวช่วยจัดการการตอบสนองใช้ชุดส่วนหัวความปลอดภัยแบบตายตัว ออบเจกต์ถ่ายโอนข้อมูล (DTO) ของข้อความแบบอะซิงโครนัสตรวจสอบความถูกต้องของพาธเอาต์พุตสองครั้ง การลงนามเป็นแบบเลือกได้ และเมื่อใช้กับระดับ Pro จะจำกัดอยู่ที่โปรไฟล์เบสไลน์ที่ระบุไว้ในเอกสารนี้

NextPDF\Symfony\Http\PdfResponse ใช้ชุดส่วนหัวเดียวกันกับการตอบสนองที่สร้างขึ้นทุกรายการ ทั้งแบบอินไลน์ แบบดาวน์โหลด และทั้งสองรูปแบบที่สตรีม ค่าคงที่ในซอร์สโค้ดยืนยันส่วนหัวเหล่านี้ไว้อย่างชัดเจน:

ส่วนหัวค่า
Cache-Controlprivate, max-age=0, must-revalidate
Pragmapublic
X-Content-Type-Optionsnosniff
X-Frame-OptionsDENY
Content-Security-Policydefault-src 'none'
X-Robots-Tagnoindex, nofollow
Referrer-Policyno-referrer

ส่วนหัวเหล่านี้ช่วยลดการเดา content-type การฝังเฟรม การจัดทำดัชนี และการรั่วไหลของ referrer สำหรับเอกสารที่สร้างขึ้น รูปแบบที่ใช้บัฟเฟอร์ยังตั้งค่า Content-Type: application/pdf และ Content-Length ด้วย ส่วนรูปแบบที่สตรีมจะตั้งค่าชนิดเนื้อหาและละเว้น Content-Length โดยเจตนา

บันเดิลกำหนดชุดส่วนหัวนี้ไว้ตายตัว หากต้องการเพิ่มหรือเปลี่ยนแปลงส่วนหัว เช่น Cache-Control ที่เข้มงวดยิ่งขึ้นสำหรับการดาวน์โหลดที่ผ่านการตรวจสอบสิทธิ์ ให้แก้ไข Response ที่ส่งคืนในคอนโทรลเลอร์ของคุณก่อนส่งคืน

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-11psr_11_container#1.1.2.p5has() ที่เป็น false หมายความว่า get() จะโยน NotFoundException
PSR-3psr_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/ — เอกสารอ้างอิงการเชื่อมต่อแบบครบวงจร