แนวทางของนักพัฒนาในการจัดการ avatar ของผู้ใช้จากผู้ให้บริการ OAuth ได้จุดประกายการถกเถียงอย่างเข้มข้นในชุมชนเทคโนโลยี โดยทำให้เกิดคำถามเกี่ยวกับความเป็นส่วนตัว การใช้งานทางเทคนิค และว่าโซลูชันนี้ตอบโจทย์ปัญหาจริงหรือไม่
เทคนิคนี้เกี่ยวข้องกับการดาวน์โหลดรูปโปรไฟล์จากบริการต่างๆ เช่น Google และ GitHub ในระหว่างการลงทะเบียนผู้ใช้ จากนั้นอัปโหลดไปยัง storage bucket ของนักพัฒนาเอง วิธีนี้ช่วยขจัดความจำเป็นในการ whitelist โดเมนภายนอกใน web framework สมัยใหม่อย่าง Next.js และ Astro ซึ่งต้องการการอนุมัติโดเมนอย่างชัดเจนเพื่อป้องกันการใช้งาน image optimization endpoint ในทางที่ผิด
การกำหนดค่า Domain Whitelisting ใน Next.js
const nextConfig: NextConfig = {
images: {
remotePatterns: [
{
protocol: "https",
hostname: "lh3.googleusercontent.com",
},
{
protocol: "https",
hostname: "images.marblecms.com",
},
],
},
};
ข้อกังวลด้านความเป็นส่วนตัวขึ้นเป็นประเด็นหลัก
แง่มุมที่ถกเถียงกันมากที่สุดของแนวทางนี้เน้นไปที่ความเป็นส่วนตัวของข้อมูลและความยินยอมของผู้ใช้ ผู้วิจารณ์โต้แย้งว่าการเก็บรูปโปรไฟล์ส่วนบุคคลโดยไม่ได้รับอนุญาตอย่างชัดเจนนั้นข้ามเส้นแบ่งทางจริยธรรม แม้ว่าผู้ใช้จะผ่านขั้นตอน OAuth flow ก็ตาม การถกเถียงนี้เผยให้เห็นความตึงเครียดพื้นฐานระหว่างความสะดวกทางเทคนิคและสิทธิความเป็นส่วนตัว
อย่างไรก็ตาม ผู้สนับสนุนชี้ให้เห็นว่า OAuth flow โดยทั่วไปจะขอข้อมูลโปรไฟล์ รวมถึงรูปภาพ และผู้ใช้สร้างบัญชีภายใต้ข้อตกลงการให้บริการ การถกเถียงนี้เน้นย้ำถึงพื้นที่สีเทาในการปฏิบัติการจัดการข้อมูลที่นักพัฒนาหลายคนต้องเผชิญในแต่ละวัน
คุณค่าทางเทคนิคถูกตรวจสอบอย่างละเอียด
การตอบสนองของชุมชนมีความหลากหลายเกี่ยวกับคุณค่าทางเทคนิคของโซลูชันนี้ นักพัฒนาบางคนมองข้ามมันว่าเป็นเพียงการแคชพื้นฐานที่ถูกปรุงแต่งให้ดูเป็นนวัตกรรม โดยตั้งคำถามว่าทำไมถึงควรค่าแก่การแบ่งปันเลย
โพสต์นี้ดูเหมือนจะเขียนโดยนักพัฒนาที่ไม่เคยได้ยินเรื่องการแคชมาก่อน และคิดว่าตัวเองได้คิดค้นโซลูชันที่ผิดกฎหมายขึ้นมาด้วยการใช้งานมัน
คนอื่นๆ แนะนำทางเลือกที่ง่ายกว่า เช่น การสร้าง proxy endpoint ที่แคชรูปภาพชั่วคราวแทนที่จะเก็บไว้อย่างถาวร แนวทางนี้จะแก้ไขปัญหาการ whitelist โดเมนเดิมในขณะที่หลีกเลี่ยงการเก็บข้อมูลผู้ใช้ในระยะยาว
ทางเลือกที่ชุมชนแนะนำ
- Proxy endpoints พร้อม temporary caching
- Cache invalidation พร้อม expiration policies
- การให้บริการรูปภาพโดยตรงโดยไม่มีการจัดเก็บถาวร
- การป้องกัน CSRF สำหรับ image optimization endpoints
ปัญหาจริงเบื้องหลังการใช้งาน Image Optimization ในทางที่ผิด
ปัญหาพื้นฐานเกิดจากวิธีที่ framework สมัยใหม่จัดการ image optimization ระบบเหล่านี้ประมวลผลรูปภาพฝั่งเซิร์ฟเวอร์ ปรับขนาดและบีบอัดเพื่อประสิทธิภาพที่ดีขึ้น หากไม่มีข้อจำกัดโดเมน ผู้ใช้ที่มีเจตนาร้ายอาจสร้างค่าใช้จ่าย compute ได้โดยการขอให้ปรับแต่งรูปภาพใดก็ได้ผ่าน endpoint เหล่านี้
ช่องโหว่นี้ถูกใช้ประโยชน์ในสถานการณ์จริง โดยผู้โจมตีตั้งใจเพิ่มค่าใช้จ่าย hosting บนแพลตฟอร์มอย่าง Vercel การถกเถียงในชุมชนเผยให้เห็นว่านักพัฒนาหลายคนไม่ทราบเกี่ยวกับช่องทางการโจมตีที่อาจเกิดขึ้นนี้
การกำหนดค่า Domain ของ Astro
export default defineConfig({
image: {
domains: ["images.marblecms.com", "avatars.githubusercontent.com"],
},
});
ทางเลือกอื่นๆ เริ่มปรากฏขึ้น
สมาชิกชุมชนหลายคนเสนอแนวทางที่แตกต่างกันสำหรับปัญหาเดียวกัน ซึ่งรวมถึงการแคชชั่วคราวที่มีการหมดอายุ proxy endpoint ที่ไม่เก็บรูปภาพอย่างถาวร และกลยุทธ์ cache invalidation ที่ดีกว่าเพื่อจัดการกับการอัปเดต avatar
การสนทนายังสัมผัสถึงข้อกังวลในการใช้งานที่กว้างขึ้น เช่น การจัดการกับการเปลี่ยนแปลง avatar และภาระการบำรุงรักษาอย่างต่อเนื่องของรูปภาพที่เก็บไว้
การถกเถียงนี้สะท้อนคำถามที่ใหญ่กว่าเกี่ยวกับการสร้างสมดุลระหว่างความปลอดภัย ความเป็นส่วนตัว และความสะดวกทางเทคนิคในการพัฒนาเว็บสมัยใหม่ แม้ว่าโซลูชันเดิมอาจใช้งานได้ แต่การตอบสนองของชุมชนแสดงให้เห็นว่าทางเลือกที่ง่ายกว่าและรุกรานความเป็นส่วนตัวน้อยกว่าอาจเหมาะสมกว่าสำหรับกรณีการใช้งานส่วนใหญ่
อ้างอิง: Stealing from Google