guest@websec: ~/websec/12-transport-cookies-third-party/th — zsh — 100×40 เขียนโดย SaKKo ENTH โค้ด:

guest@websec ~ % man 12-transport-cookies-third-party

12 · การรับส่งข้อมูล คุกกี้ และสคริปต์ของบุคคลที่สาม

การเสริมความแข็งแรงฝั่งเบราว์เซอร์จากเช็กลิสต์ของ Mozilla: HTTPS คุกกี้ และไม่เชื่อ CDN แบบไม่ตรวจ

12.1 TLS ทุกที่

HTTPS ทุกเว็บ แม้แต่เว็บ "static" หน้า HTTP ธรรมดาถูกอ่านหรือแก้ระหว่างทางได้

  • ใช้ SSL config generator ของ Mozilla ระดับ "Intermediate" เหมาะกับเว็บส่วนใหญ่
  • ต่ออายุใบรับรองอัตโนมัติ
  • ทดสอบด้วย SSL Labs หลังเปลี่ยนแปลง

redirect ที่ทำให้ HSTS ยังทำงาน

ไป HTTP → HTTPS บน host เดิมก่อน แล้วค่อยไป www เพื่อให้ HSTS ติด ส่วน API: ปิด HTTP ไปเลย

Mixed content

สคริปต์ http:// ตัวเดียวบนหน้า HTTPS ก็ทำลายทั้งหมด ให้โหลดทุกอย่างผ่าน HTTPS

force_ssl ดูแล redirect และ HSTS ส่วนใบรับรองและ TLS ตั้งที่ proxy ไม่ใช่ใน Rails

12.2 คุกกี้: attribute และ prefix

ล็อกคุกกี้ให้แน่นที่สุด:

attributeทำอะไรคำแนะนำ
Secureส่งผ่าน HTTPS เท่านั้นเสมอ
HttpOnlyJavaScript มองไม่เห็น (document.cookie)เสมอ เว้นแต่ JS ต้องอ่านจริงๆ
SameSiteStrict: ไม่ส่งข้ามเว็บเลย · Lax: เฉพาะการนำทางระดับบนสุดแบบ GET · None: ส่งเสมอ (ต้องมี Secure)Lax หรือ Strict
Domainไม่ระบุ = host นี้เท่านั้น; Domain=example.com = ทุก subdomain ด้วยไม่ต้องระบุ เว้นแต่ต้องแชร์
Pathจำกัด path ที่ได้รับคุกกี้ (แยกได้ไม่แข็งแรง)/ หรือแคบกว่า
Expires/Max-Ageการคงอยู่ ถ้าไม่มีจะเป็น session cookieสั้นสำหรับ session
prefix __Host-เบราว์เซอร์ปฏิเสธคุกกี้ เว้นแต่มี Secure, Path=/ และไม่มี Domainดีที่สุดสำหรับคุกกี้ session
prefix __Secure-เบราว์เซอร์ปฏิเสธคุกกี้ เว้นแต่มี Secureสำหรับคุกกี้ที่ต้องมี Domain

ทำไมต้องมี prefix? ถ้าไม่มี subdomain ที่ถูกลืมแล้วผู้โจมตียึดไป จะเขียนทับคุกกี้ของเราได้ คุกกี้ __Host- มาได้จาก host ของเราเท่านั้น

sim: ตัวสร้างคุกกี้สร้าง header Set-Cookie และรับคำแนะนำ

header

ผลตรวจ

คุกกี้ session เป็น HttpOnly และ Lax อยู่แล้ว และเป็น Secure เมื่อเปิด force_ssl เปลี่ยนชื่อคีย์เป็น __Host-myapp_session เพื่อใช้ prefix
# config/initializers/session_store.rb
Rails.application.config.session_store :cookie_store, key: "__Host-myapp_session"

# your own cookies (string key: the prefix contains "-")
cookies.encrypted["__Host-prefs"] = { value: { theme: "dark" }, httponly: true,
                                       secure: true, same_site: :strict, expires: 30.days }

12.3 สคริปต์ของบุคคลที่สาม และ Subresource Integrity (SRI)

สคริปต์จาก CDN ทุกตัวรันด้วยสิทธิ์เต็มบนหน้าเรา ถ้า CDN ถูกแฮก เราก็โดน ปี 2024 polyfill.io เปลี่ยนเจ้าของแล้วเริ่มส่งมัลแวร์ให้เว็บกว่า 100,000 เว็บ

SRI ตรึงสคริปต์ไว้กับ hash ถ้าไฟล์เปลี่ยน เบราว์เซอร์จะไม่รัน

sim: การตรวจ SRISHA-384 จริงในเบราว์เซอร์ของคุณ

หน้าเว็บตรึงไลบรารีไว้ตอนเพิ่มเข้ามา แล้วมีคนแก้ไฟล์บน CDN

  • host สคริปต์เองถ้าทำได้
  • ตรึงเวอร์ชันและใส่ SRI เมื่อใช้ CDN
  • จำกัดแหล่งสคริปต์ด้วย CSP
  • ลบสคริปต์ที่ไม่มีใครใช้
Importmap และ jsbundling ส่ง JS จากโดเมนของเราเอง จึงเลี่ยงปัญหานี้ได้ ถ้าใช้แท็กจาก CDN ให้ใส่ integrity: และ crossorigin:

12.4 robots.txt ไม่ใช่การควบคุมความปลอดภัย

มันเป็นไฟล์สาธารณะ และผู้โจมตีอ่านเป็นอย่างแรก การใส่ path ลับไว้ที่นั่นเท่ากับป่าวประกาศ ให้ใช้การยืนยันตัวตนจริง