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 ไม่ใช่ใน Rails12.2 คุกกี้: attribute และ prefix
ล็อกคุกกี้ให้แน่นที่สุด:
| attribute | ทำอะไร | คำแนะนำ |
|---|---|---|
Secure | ส่งผ่าน HTTPS เท่านั้น | เสมอ |
HttpOnly | JavaScript มองไม่เห็น (document.cookie) | เสมอ เว้นแต่ JS ต้องอ่านจริงๆ |
SameSite | Strict: ไม่ส่งข้ามเว็บเลย · 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 ของเราเท่านั้น
header
ผลตรวจ
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 ถ้าไฟล์เปลี่ยน เบราว์เซอร์จะไม่รัน
หน้าเว็บตรึงไลบรารีไว้ตอนเพิ่มเข้ามา แล้วมีคนแก้ไฟล์บน CDN
- host สคริปต์เองถ้าทำได้
- ตรึงเวอร์ชันและใส่ SRI เมื่อใช้ CDN
- จำกัดแหล่งสคริปต์ด้วย CSP
- ลบสคริปต์ที่ไม่มีใครใช้
integrity: และ crossorigin:12.4 robots.txt ไม่ใช่การควบคุมความปลอดภัย
มันเป็นไฟล์สาธารณะ และผู้โจมตีอ่านเป็นอย่างแรก การใส่ path ลับไว้ที่นั่นเท่ากับป่าวประกาศ ให้ใช้การยืนยันตัวตนจริง