การแก้ไขข้อผิดพลาดการตรวจสอบ CSRF ล้มเหลวใน Paperless-ngx

อัปเดตล่าสุด: 03/11/2026

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

หาก Paperless-ngx แสดง 403 ห้ามเข้าถึง: การตรวจสอบ CSRF ล้มเหลว เมื่อเข้าสู่ระบบ แอปพลิเคชันปฏิเสธการตรวจสอบความปลอดภัยของคำขอ ซึ่งมักเกิดขึ้นหลังจากเปลี่ยนโดเมน เปิดใช้งาน HTTPS หรือกำหนดค่าพร็อกซีแบบย้อนกลับ แต่ก็อาจเกี่ยวข้องกับคุกกี้หรือแบบฟอร์มที่ล้าสมัยได้เช่นกัน

วิธีแก้ปัญหาคือการระบุสาเหตุที่เฉพาะเจาะจง ตรวจสอบ URL สาธารณะ และตรวจสอบให้แน่ใจว่าการตั้งค่าดังกล่าวส่งไปถึง Paperless แล้ว คุณไม่จำเป็นต้องปิดใช้งานการป้องกัน CSRF หรือแก้ไขสิทธิ์การเข้าถึงเอกสาร

ระบุสาเหตุที่ทำให้เกิดข้อผิดพลาด CSRF ใน Paperless-ngx

อะไรคือสาเหตุที่ทำให้เกิดข้อผิดพลาด CSRF ใน Paperless-ngx?

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

ตรวจสอบให้แน่ใจว่าประกาศดังกล่าวระบุอย่างชัดเจนถึงเรื่องนี้ การตรวจสอบ CSRF ล้มเหลวข้อผิดพลาด 403 ที่เกิดจาก Cloudflare, กฎพร็อกซี หรือระบบการเข้าถึงภายนอก อาจมีสาเหตุอื่นได้เช่นกัน

หากคุณใช้ Docker Compose ให้ลองทำซ้ำขั้นตอนที่ทำให้เกิดข้อผิดพลาดและตรวจสอบบันทึก:

docker compose logs --tail=100 webserver

ในตัวอย่างที่เราใช้ webserver ใช้เป็นชื่อบริการ แทนที่ด้วยชื่อของการปรับใช้ของคุณ มองหาข้อมูลอ้างอิงถึง django.security.csrf และเหตุผลในการปฏิเสธ

  • การตรวจสอบแหล่งที่มาล้มเหลว: ตรวจสอบแหล่งที่มาที่ปรากฏในประกาศและการตั้งค่าสาธารณะ
  • ไม่ได้ตั้งค่าคุกกี้ CSRF: ตรวจสอบว่าเบราว์เซอร์รับและเก็บรักษาคุกกี้ไว้หรือไม่
  • โทเค็นหายไปหรือไม่ถูกต้อง: กรุณารีเฟรชหน้าเว็บก่อนส่งแบบฟอร์ม
  • การตรวจสอบแหล่งที่มาของข้อมูลล้มเหลว: ตรวจสอบส่วนหัวและเข้าถึงผ่าน HTTPS
เนื้อหาพิเศษ - คลิกที่นี่  อธิบายข้อความอุปกรณ์สูญหายใน Unreal Engine: สาเหตุและวิธีแก้ไขในโลกแห่งความเป็นจริง

กำหนดค่า PAPERLESS_URL ด้วยที่อยู่สาธารณะที่ถูกต้อง

รหัสการตั้งค่าจะแสดงบนหน้าจอ

สำหรับที่อยู่สาธารณะที่ไม่ซ้ำกัน ให้กำหนดค่า ลิงก์แบบไร้กระดาษระบุโปรโตคอลและพอร์ตหากไม่ใช่ค่าเริ่มต้น แต่ไม่ต้องเพิ่มเครื่องหมายทับหรือพาธต่อท้าย เช่น /accounts/login/.

ตัวอย่างเช่น:

PAPERLESS_URL=https://documentos.example.com

ตัวแปรนี้ใช้ในการกำหนดค่าร่วมกันสำหรับโฮสต์ที่อนุญาต, CORS และแหล่งที่มาของ CSRF ที่เชื่อถือได้ ระบบจะไม่แปลงที่อยู่ทั้งหมดให้เป็นค่าเทียบเท่าโดยอัตโนมัติ จากนั้นคุณสามารถเปิดใช้งานอินสแตนซ์ได้

หากคุณเผยแพร่ Paperless ภายใต้เส้นทางย่อย เช่น https://example.com/paperlessอย่าใส่เส้นทางนั้นลงใน PAPERLESS_URL การใช้งานแบบนั้นต้องกำหนดค่าคำนำหน้าและพร็อกซีแยกต่างหาก

ตรวจสอบให้แน่ใจว่า Docker ได้รับตัวแปรนั้นแล้ว

ไฟล์ .env สามารถใช้เพื่อแทนที่ค่าต่างๆ ใน ​​Compose ได้ แต่ตัวแปรเหล่านี้จะไม่ถูกรวมเข้ากับสภาพแวดล้อมของบริการทั้งหมดโดยอัตโนมัติ

คุณสามารถเพิ่มโค้ดส่วนนี้ลงในบริการ Paperless ที่มีอยู่ได้:

services:
  webserver:
    environment:
      PAPERLESS_URL: "https://documentos.example.com"

ผสานการปรับแต่งโดยไม่ต้องแทนที่ส่วนที่เหลือของไฟล์ Compose ของคุณ คงไว้ซึ่งรูปภาพ ปริมาณ ความสัมพันธ์ และตัวแปรอื่นๆ ที่คุณเคยใช้ไปแล้ว

หากคุณต้องการบันทึกการตั้งค่าลงในไฟล์ โปรดระบุให้ชัดเจน:

services:
  webserver:
    env_file:
      - paperless.env

และภายใน paperless.env:

PAPERLESS_URL=https://documentos.example.com

ตรวจสอบความเป็นไปได้ของการซ้ำซ้อน: หากตัวแปรนั้นปรากฏอยู่ในรายการอื่นด้วย environmentค่าดังกล่าวจะมีผลเหนือกว่าค่าที่กำหนดไว้ใน env_file.

ทำการเปลี่ยนแปลงโดยการสร้างบริการขึ้นใหม่

แล็ปท็อปแสดงเครื่องมือแก้ไขข้อผิดพลาด

หลังจากเปลี่ยนค่าตัวแปรแล้ว ให้รันคำสั่งจากโปรเจ็กต์ Compose ที่เกี่ยวข้อง:

docker compose up -d --no-deps --force-recreate webserver

ตัวอย่างนี้สมมติว่าบริการที่เกี่ยวข้องทำงานอยู่แล้ว โดยจะสร้าง Paperless ขึ้นมาใหม่โดยไม่ได้หยุดฐานข้อมูลและส่วนอื่นๆ ของระบบโดยเจตนา

เนื้อหาพิเศษ - คลิกที่นี่  วิธีแก้ไขลิงก์ด้วย Pinegrow?

คำสั่ง `docker compose restart` แบบธรรมดาจะไม่ทำการอัปเดตสภาพแวดล้อมของคอนเทนเนอร์ นอกจากนี้ คุณไม่จำเป็นต้องลบข้อมูลใดๆ เพื่อใช้การปรับเปลี่ยนเหล่านี้

ตรวจสอบค่าที่ได้รับ:

docker compose exec webserver printenv PAPERLESS_URL

หากไม่พบที่อยู่ที่คาดหวัง โปรดตรวจสอบไฟล์ที่แก้ไข บริการ และตัวแปรที่ซ้ำกัน หากคุณใช้ตัวเลือกต่างๆ เช่น -f หรือชื่อโปรเจ็กต์เฉพาะเจาะจง ระบบจะยังคงรักษาตัวเลือกเหล่านั้นไว้ในคำสั่งต่างๆ

ควรใช้ PAPERLESS_CSRF_TRUSTED_ORIGINS เมื่อใด

PAPERLESS_CSRF_TRUSTED_ORIGINS ไม่ใช่ตัวแปรที่ล้าสมัย อนุญาตให้คุณประกาศแหล่งข้อมูลเพิ่มเติมสำหรับคำขอที่ได้รับการป้องกัน CSRF

ตัวอย่างเช่น สำหรับสองทิศทางที่เชื่อถือได้:

PAPERLESS_CSRF_TRUSTED_ORIGINS=https://documentos.example.com,https://archivo.example.com

ใช้แหล่งข้อมูลที่ระบุ พร้อมโปรโตคอลและพอร์ตหากจำเป็น อย่าสับสนรายการนี้กับ PAPERLESS_ALLOWED_HOSTSโดยที่ชื่อโฮสต์ถูกกำหนดค่าโดยไม่มีโปรโตคอล

การอนุญาตแหล่งที่มาไม่ได้แทนที่การตั้งค่าโดเมน ใบรับรอง หรือพร็อกซี แต่เป็นการเพิ่มที่อยู่ที่คุณใช้งานและควบคุมได้จริงเท่านั้น

ตรวจสอบส่วนหัว HTTPS และ Reverse Proxy

บุคคลที่กำลังใช้งานแล็ปท็อปในห้องเซิร์ฟเวอร์

พร็อกซีต้องส่งข้อมูลโฮสต์และรูปแบบภายนอกอย่างถูกต้อง การเปลี่ยนโฮสต์ไม่ใช่ข้อบังคับเมื่อใช้ Nginx Proxy Manager, Traefik หรือ Cloudflare Tunnel ขึ้นอยู่กับการตั้งค่าของแต่ละตัว

เนื้อหาพิเศษ - คลิกที่นี่  คู่มือฉบับสมบูรณ์ของ Firecrawl: วิธีการป้อนข้อมูลเว็บลงในฐานข้อมูลความรู้ AI

หากเบราว์เซอร์ใช้ HTTPS และพร็อกซีสื่อสารกับ Paperless ผ่าน HTTP อาจจำเป็นต้องระบุวิธีการรับรู้การเชื่อมต่อภายนอกที่ปลอดภัย:

PAPERLESS_PROXY_SSL_HEADER='["HTTP_X_FORWARDED_PROTO", "https"]'

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

ในเครือข่ายที่มีพร็อกซีหลายตัว ให้ตรวจสอบรูปแบบการเชื่อมต่อที่ไปถึงปลายทางสุดท้าย ไม่ควรเปิดใช้งานตัวเลือกความเชื่อถือในส่วนหัวที่ส่งต่อทั้งหมดในลักษณะที่ใช้ได้กับทุกกรณี

หากบันทึกแสดงแหล่งที่มา null หรือปัญหาเกี่ยวกับผู้แนะนำ โปรดตรวจสอบนโยบายการแนะนำที่ใช้กับแบบฟอร์มด้วย เอกสารวิกิของโครงการมีข้อมูลเกี่ยวกับปัญหาการเข้าถึงที่เกี่ยวข้องกับเรื่องนี้ Referrer-Policy: no-referrerการแก้ไข URL ที่อนุญาตอาจไม่เพียงพอในกรณีนั้น

ลบคุกกี้เก่าและแบบฟอร์มที่ล้าสมัยทิ้งไป

เมื่อแก้ไขการตั้งค่าเซิร์ฟเวอร์เสร็จแล้ว ให้เปิดที่อยู่เว็บสุดท้ายอีกครั้งและโหลดแบบฟอร์มล็อกอินใหม่ หลีกเลี่ยงการส่งข้อมูลจากแท็บเก่าหรือการสลับไปมาระหว่าง HTTP, HTTPS, IP และโดเมนระหว่างการทดสอบ

หากปัญหาเกี่ยวข้องกับคุกกี้หรือโทเค็น ลองใช้โหมดการเรียกดูแบบส่วนตัว หรือลบข้อมูลจากเว็บไซต์ Paperless ทิ้งไปเลย นอกจากนี้ ตรวจสอบดูว่ามีส่วนขยายใดปิดกั้นคุกกี้หรือแก้ไขคำขอหรือไม่

เป้าหมายคือเพื่อให้เบราว์เซอร์ พร็อกซี และแอปพลิเคชันมีที่อยู่การเข้าถึงและบริบทที่ตรงกัน การปิดใช้งาน CSRF การขยายแหล่งข้อมูลโดยไม่เลือกปฏิบัติ หรือการลบข้อมูลการปรับใช้ ไม่ได้แก้ปัญหาที่ต้นเหตุ.