ความปลอดภัยและการปฏิบัติการ — NextPDF บน CodeIgniter 4
ภาพรวมโดยสังเขป
หัวข้อที่มีชื่อว่า “ภาพรวมโดยสังเขป”หน้านี้อธิบายภัยคุกคามที่การผสานรวมนี้ต้องรับมือ การควบคุมที่ผ่านการตรวจสอบในซอร์สของแพ็กเกจ และกฎการปฏิบัติการที่ควรปฏิบัติตามเพื่อให้การนำไปใช้งานปลอดภัย
แบบจำลองภัยคุกคาม
หัวข้อที่มีชื่อว่า “แบบจำลองภัยคุกคาม”คุณต้องคำนึงถึงพื้นผิวการโจมตีสามจุดที่ผู้โจมตีสามารถมีอิทธิพลได้
- เพย์โหลดของงานในคิว คิวจัดเก็บข้อมูลงาน ผู้โจมตีที่เข้าถึงโบรกเกอร์ได้สามารถเปลี่ยนแปลงข้อมูลนั้นได้ ให้ถือว่าเป็นอินพุตที่ผ่านการดีซีเรียลไลซ์และไม่น่าเชื่อถือ
- ชื่อไฟล์ของการตอบสนอง ผู้ใช้สามารถระบุชื่อไฟล์ที่ดาวน์โหลดได้ ชื่อที่เป็นอันตรายสามารถแทรกเนื้อหาเข้าไปในส่วนหัวได้
- พาธในการกำหนดค่า พาธของฟอนต์และพาธสำหรับการลงนามมาจากการกำหนดค่า พาธที่เป็นอันตรายสามารถทำให้อ่านจากหรือเขียนไปยังตำแหน่งที่ผิดได้
การควบคุมที่ 1 — รายการอนุญาตของเพย์โหลดในคิว
หัวข้อที่มีชื่อว่า “การควบคุมที่ 1 — รายการอนุญาตของเพย์โหลดในคิว”งานในคิวถือว่าเพย์โหลดเป็นข้อมูลที่ผ่านการดีซีเรียลไลซ์และไม่น่าเชื่อถือ Open Worldwide Application Security Project (OWASP) Application Security Verification Standard (ASVS) กำหนดให้ต้องจัดการอินพุตอย่างปลอดภัยสำหรับข้อมูลที่ผ่านการดีซีเรียลไลซ์และไม่น่าเชื่อถือ (ASVS V1.5.2)
การควบคุมที่ผ่านการตรวจสอบใน GeneratePdfJob:
- บิลเดอร์ต้องเป็นสตริงที่ไม่ว่างเปล่า งานจะปฏิเสธชนิดข้อมูลอื่นทั้งหมด
- บิลเดอร์ต้องตรงกับรูปแบบ
App\PdfBuilders\<Class>::<method>งานจะปฏิเสธเนมสเปซอื่นทั้งหมด ฟังก์ชันธรรมดา และเพย์โหลดที่มีคำนำหน้าหรือคำต่อท้าย - บิลเดอร์ต้องสามารถเรียกใช้งานได้ งานจะปฏิเสธสตริงที่ตรงตามรูปแบบแต่ไม่สามารถระบุเป้าหมายได้
กฎเหล่านี้ร่วมกันจะปิดกั้นการเรียกใช้โค้ดตามอำเภอใจผ่านเพย์โหลดในคิวที่ถูกดัดแปลง การทดสอบของแพ็กเกจยืนยันกรณีการปฏิเสธแต่ละกรณี
การควบคุมที่ 2 — การจำกัดพาธเอาต์พุตของคิว
หัวข้อที่มีชื่อว่า “การควบคุมที่ 2 — การจำกัดพาธเอาต์พุตของคิว”งานจะเขียนไฟล์ลงดิสก์ OWASP ASVS กำหนดให้ต้องจัดการพาธอย่างปลอดภัยเมื่อแอปพลิเคชันสร้างพาธไฟล์สำหรับการทำงานกับไฟล์ (ASVS V5.3.2)
การควบคุมที่ผ่านการตรวจสอบใน GeneratePdfJob:
- พาธเอาต์พุตต้องเป็นสตริงที่ไม่ว่างเปล่า
- งานจะทำพาธให้เป็นรูปแบบมาตรฐานก่อนการตรวจสอบใดๆ โดยจะแปลงเซกเมนต์
.และ..รวมถึงตัวคั่น - พาธที่ทำให้เป็นรูปแบบมาตรฐานแล้วต้องอยู่ภายใน
WRITEPATH/pdfs/งานจะปฏิเสธไดเรกทอรีระดับเดียวกันที่ใช้คำนำหน้าชื่อร่วมกัน (pdfs-evil/) - พาธต้องลงท้ายด้วย
.pdf(ไม่คำนึงถึงตัวพิมพ์ใหญ่เล็ก)
กฎเหล่านี้จะปิดกั้นการเขียนไฟล์ตามอำเภอใจผ่านเพย์โหลดที่ถูกดัดแปลง
การควบคุมที่ 3 — การเสริมความแข็งแกร่งของส่วนหัวในการตอบสนอง
หัวข้อที่มีชื่อว่า “การควบคุมที่ 3 — การเสริมความแข็งแกร่งของส่วนหัวในการตอบสนอง”PdfResponse จะแนบชุดส่วนหัวที่กำหนดตายตัวและเสริมความแข็งแกร่งไว้กับการตอบสนอง Portable Document Format (PDF) ทุกครั้ง:
| ส่วนหัว | ค่า |
|---|---|
X-Content-Type-Options | nosniff |
X-Frame-Options | DENY |
Content-Security-Policy | default-src 'none' |
X-Robots-Tag | noindex, nofollow |
Referrer-Policy | no-referrer |
Cache-Control | private, 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 เข้าไปในโค้ดของโดเมน
การปฏิบัติการลงนามและ TSA (NextPDF Pro / Enterprise)
หัวข้อที่มีชื่อว่า “การปฏิบัติการลงนามและ TSA (NextPDF Pro / Enterprise)”บริการลงนามปิดใช้งานตามค่าเริ่มต้น และจะเปิดใช้งานเฉพาะเมื่อ 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 ทั้งหมด