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

ความปลอดภัยและการปฏิบัติการ — NextPDF บน CodeIgniter 4

หน้านี้อธิบายภัยคุกคามที่การผสานรวมนี้ต้องรับมือ การควบคุมที่ผ่านการตรวจสอบในซอร์สของแพ็กเกจ และกฎการปฏิบัติการที่ควรปฏิบัติตามเพื่อให้การนำไปใช้งานปลอดภัย

คุณต้องคำนึงถึงพื้นผิวการโจมตีสามจุดที่ผู้โจมตีสามารถมีอิทธิพลได้

  1. เพย์โหลดของงานในคิว คิวจัดเก็บข้อมูลงาน ผู้โจมตีที่เข้าถึงโบรกเกอร์ได้สามารถเปลี่ยนแปลงข้อมูลนั้นได้ ให้ถือว่าเป็นอินพุตที่ผ่านการดีซีเรียลไลซ์และไม่น่าเชื่อถือ
  2. ชื่อไฟล์ของการตอบสนอง ผู้ใช้สามารถระบุชื่อไฟล์ที่ดาวน์โหลดได้ ชื่อที่เป็นอันตรายสามารถแทรกเนื้อหาเข้าไปในส่วนหัวได้
  3. พาธในการกำหนดค่า พาธของฟอนต์และพาธสำหรับการลงนามมาจากการกำหนดค่า พาธที่เป็นอันตรายสามารถทำให้อ่านจากหรือเขียนไปยังตำแหน่งที่ผิดได้

การควบคุมที่ 1 — รายการอนุญาตของเพย์โหลดในคิว

หัวข้อที่มีชื่อว่า “การควบคุมที่ 1 — รายการอนุญาตของเพย์โหลดในคิว”

งานในคิวถือว่าเพย์โหลดเป็นข้อมูลที่ผ่านการดีซีเรียลไลซ์และไม่น่าเชื่อถือ Open Worldwide Application Security Project (OWASP) Application Security Verification Standard (ASVS) กำหนดให้ต้องจัดการอินพุตอย่างปลอดภัยสำหรับข้อมูลที่ผ่านการดีซีเรียลไลซ์และไม่น่าเชื่อถือ (ASVS V1.5.2)

การควบคุมที่ผ่านการตรวจสอบใน GeneratePdfJob:

  • บิลเดอร์ต้องเป็นสตริงที่ไม่ว่างเปล่า งานจะปฏิเสธชนิดข้อมูลอื่นทั้งหมด
  • บิลเดอร์ต้องตรงกับรูปแบบ App\PdfBuilders\<Class>::<method> งานจะปฏิเสธเนมสเปซอื่นทั้งหมด ฟังก์ชันธรรมดา และเพย์โหลดที่มีคำนำหน้าหรือคำต่อท้าย
  • บิลเดอร์ต้องสามารถเรียกใช้งานได้ งานจะปฏิเสธสตริงที่ตรงตามรูปแบบแต่ไม่สามารถระบุเป้าหมายได้

กฎเหล่านี้ร่วมกันจะปิดกั้นการเรียกใช้โค้ดตามอำเภอใจผ่านเพย์โหลดในคิวที่ถูกดัดแปลง การทดสอบของแพ็กเกจยืนยันกรณีการปฏิเสธแต่ละกรณี

งานจะเขียนไฟล์ลงดิสก์ OWASP ASVS กำหนดให้ต้องจัดการพาธอย่างปลอดภัยเมื่อแอปพลิเคชันสร้างพาธไฟล์สำหรับการทำงานกับไฟล์ (ASVS V5.3.2)

การควบคุมที่ผ่านการตรวจสอบใน GeneratePdfJob:

  • พาธเอาต์พุตต้องเป็นสตริงที่ไม่ว่างเปล่า
  • งานจะทำพาธให้เป็นรูปแบบมาตรฐานก่อนการตรวจสอบใดๆ โดยจะแปลงเซกเมนต์ . และ .. รวมถึงตัวคั่น
  • พาธที่ทำให้เป็นรูปแบบมาตรฐานแล้วต้องอยู่ภายใน WRITEPATH/pdfs/ งานจะปฏิเสธไดเรกทอรีระดับเดียวกันที่ใช้คำนำหน้าชื่อร่วมกัน (pdfs-evil/)
  • พาธต้องลงท้ายด้วย .pdf (ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก)

กฎเหล่านี้จะปิดกั้นการเขียนไฟล์ตามอำเภอใจผ่านเพย์โหลดที่ถูกดัดแปลง

การควบคุมที่ 3 — การเสริมความแข็งแกร่งของส่วนหัวในการตอบสนอง

หัวข้อที่มีชื่อว่า “การควบคุมที่ 3 — การเสริมความแข็งแกร่งของส่วนหัวในการตอบสนอง”

PdfResponse จะแนบชุดส่วนหัวที่กำหนดตายตัวและเสริมความแข็งแกร่งไว้กับการตอบสนอง Portable Document Format (PDF) ทุกครั้ง:

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

แพ็กเกจจะทำความสะอาดชื่อไฟล์ก่อนส่งไปยังส่วนหัว โดยตัดตัวคั่นพาธ ไบต์ว่าง (null byte) และอักขระ carriage return/line feed (CR/LF) ออก escape อัญประกาศคู่สำหรับรูปแบบที่อยู่ในเครื่องหมายคำพูด และเพิ่มพารามิเตอร์ filename*=UTF-8''… ตาม Request for Comments (RFC) 5987 สำหรับชื่อที่ไม่ใช่ ASCII ชื่อที่ว่างเปล่าจะกลายเป็น document.pdf

การควบคุมที่ 4 — การตรวจสอบความถูกต้องของพาธในการกำหนดค่า

หัวข้อที่มีชื่อว่า “การควบคุมที่ 4 — การตรวจสอบความถูกต้องของพาธในการกำหนดค่า”

รีจิสทรีของฟอนต์จะปฏิเสธค่า fontsPath ที่มีสตรีมแรปเปอร์ (://) หรือไบต์ว่าง และทำให้เกิดข้อผิดพลาดขณะรันไทม์ ลักษณะนี้จะปิดกั้นพาธที่ถูกแรปไว้ เช่น php:// หรือ phar://

การควบคุมที่ 5 — พื้นผิวของ service-locator ที่น้อยที่สุด

หัวข้อที่มีชื่อว่า “การควบคุมที่ 5 — พื้นผิวของ service-locator ที่น้อยที่สุด”

CodeIgniter 4 ไม่ได้จัดเตรียมคอนเทนเนอร์ตาม PHP Standards Recommendation 11 (PSR-11) แต่ใช้ตัวระบุตำแหน่ง Services แทน PSR-11 §1.3 ถือว่ารูปแบบ service-locator เป็นรูปแบบที่ไม่ควรใช้ (modal SHOULD NOT) แพ็กเกจจึงรักษาพื้นผิวของตัวระบุตำแหน่งให้มีขนาดเล็ก: แต่ละบริการมีเมธอดโรงงานแบบมีชื่อเพียงหนึ่งเมธอด ระบุเป้าหมายของบริการที่ขอบเขตของคอนโทรลเลอร์ ส่งอ็อบเจกต์ที่เป็นรูปธรรมเข้าไปยังชั้นภายใน อย่าส่งคลาส Services เข้าไปในโค้ดของโดเมน

บริการลงนามปิดใช้งานตามค่าเริ่มต้น และจะเปิดใช้งานเฉพาะเมื่อ signature.enabled เป็น true และ signature.certificate ไม่ว่างเปล่า ระดับลายเซ็นเริ่มต้นของแพ็กเกจคือ B-B NextPDF Pro จัดเตรียมลายเซ็นพื้นฐานระดับ B-B การตรวจสอบความถูกต้องระยะยาวเป็นความสามารถของ Enterprise ที่แยกต่างหาก ซึ่งอธิบายไว้ในเอกสารอ้างอิง Premium ไม่ใช่ที่นี่

กฎการปฏิบัติการ:

  • เก็บไฟล์ใบรับรองและไฟล์คีย์ไว้นอกระบบควบคุมเวอร์ชัน ส่งผ่าน .env หรือตัวจัดการความลับ
  • ตั้งค่า tsa.allow_insecure_http ไว้เป็น false ในการใช้งานจริง ช่องทาง Time Stamping Authority (TSA) แบบข้อความธรรมดาไม่สามารถยอมรับได้
  • ตั้งค่า tsa.pinned_public_keys เมื่อ TSA เผยแพร่คีย์ที่เสถียร และตั้งค่า tsa.warn_on_key_rotation ไว้เป็น true
  • จำกัดสิทธิ์การอ่านไฟล์คีย์ไว้เฉพาะผู้ใช้ของแอปพลิเคชัน
  • ปักหมุดเวอร์ชันทั้งหมดที่ระบุได้ไว้ใน composer.lock
  • กำหนดให้ต้องมี codeigniter4/queue ในแอปพลิเคชันที่รันเวิร์กเกอร์
  • รันเวิร์กเกอร์คิวในฐานะผู้ใช้ที่มีสิทธิ์ต่ำ ให้สิทธิ์การเขียนเฉพาะที่ WRITEPATH/pdfs/ เท่านั้น
  • กำหนดให้เวิร์กเกอร์มีส่วนขยาย NextPDF ชุดเดียวกับชั้นเว็บ PDF ที่ลงนามแล้วต้องใช้ NextPDF Pro หรือ Enterprise ในสภาพแวดล้อมของเวิร์กเกอร์
  • ตรวจยืนยันว่าส่วนขยาย mbstring และ zlib พร้อมใช้งานในทุกรันไทม์ที่สร้าง PDF
  • ตรวจยืนยันว่าส่วนหัวของการตอบสนองยังคงอยู่หลังผ่านรีเวิร์สพร็อกซี
  • บันทึกการสร้าง PDF พร้อมบริบท อย่าบันทึกข้อมูลใบรับรองหรือรหัสผ่านของคีย์
  • การจัดการเพย์โหลดในคิวสอดคล้องกับ OWASP ASVS V1.5.2
  • การจัดการพาธเอาต์พุตของคิวสอดคล้องกับ OWASP ASVS V5.3.2
  • การออกแบบตัวระบุตำแหน่งเป็นไปตามแนวทาง PSR-11 §1.3

NextPDF core ได้รับอนุญาตภายใต้ Apache-2.0 จุดยึดความเชื่อถือของลายเซ็นและการเสริมความแข็งแกร่งของ TSA จะมีผลเมื่อมีการติดตั้ง NextPDF Pro หรือ Enterprise แพ็กเกจ CodeIgniter จะเปิดเผยเมธอดบริการที่เกี่ยวข้อง ซึ่งจะคืนค่า null จนกว่าจะติดตั้งแพ็กเกจ Premium ที่ตรงกัน ดู </get-license/?intent=codeigniter-signing>

  • /integrations/codeigniter/production-usage/ — การลงทะเบียนและส่งงานในคิวอย่างถูกต้อง
  • /integrations/codeigniter/configuration/ — คีย์สำหรับการลงนาม TSA และพาธ
  • /integrations/codeigniter/troubleshooting/ — ข้อความการปฏิเสธที่ผ่านการตรวจสอบ
  • /integrations/codeigniter/overview/ — พื้นผิว API ทั้งหมด