ทำไมส่วนขยาย Grammarly ถึงทำให้เว็บไซต์พัง
- ในช่วงหลายเดือนที่ผ่านมา ผู้เขียนมักได้รับรายงานว่า เลย์เอาต์ของเว็บไซต์พังแบบแปลก ๆ
- สาเหตุของปัญหาถูกพบว่าเป็น ส่วนขยายเบราว์เซอร์ Grammarly และเพื่อยืนยันเรื่องนี้ ผู้เขียนจึงลองติดตั้งด้วยตนเอง
กระบวนการค้นพบปัญหา
- ส่วนขยาย Grammarly ขอสิทธิ์ดังต่อไปนี้:
- เข้าถึงข้อมูลของทุกเว็บไซต์
- แสดงการแจ้งเตือน
- เข้าถึงแท็บของเบราว์เซอร์
- จากการทดลองบน Firefox พบว่า Grammarly แทรก สไตล์ชีตของตัวเอง เข้าไปในหน้าเว็บ
- สไตล์ชีตนี้ไม่สามารถตรวจจับได้โดยตรงจากหน้าเว็บ (เป็นสไตล์ชีตที่ซ่อนอยู่)
- ถึงขั้นหลบเลี่ยง Content Security Policy ได้
- ยังมีการแทรกองค์ประกอบ
<grammarly-desktop-integration> เข้าไปในแท็ก <html> ด้วย (ยังไม่ชัดเจนว่ามีไว้เพื่ออะไร)
แล้วทำไมถึงเป็นเว็บไซต์ของผู้เขียน?
วิธีรับมือของผู้เขียน
- ตอนแรกผู้เขียนใช้ Mutation Observer เพื่อตรวจจับองค์ประกอบที่ Grammarly แทรกเข้ามา แล้วใช้สไตล์
!important เขียนทับ
- หลังจากนั้นจึงเปลี่ยนชื่อตัวแปร CSS ของตัวเองจาก
--rem เป็น --🤡 (อีโมจิยูนิโค้ด)
- อีโมจิสามารถใช้เป็นชื่อตัวแปร CSS ได้อย่างถูกต้อง
- วิธีนี้ช่วยหลีกเลี่ยงการชนกับการตั้งค่า
--rem แบบโกลบอลของ Grammarly ได้
แก่นของปัญหา
- Grammarly ในฐานะเว็บเอ็กซ์เทนชัน ได้บังคับแทรกสไตล์ระดับโกลบอลเข้าไปในทุกเว็บไซต์
- โดยเฉพาะการใช้ชื่อตัวแปร CSS ทั่วไปอย่าง
--rem นั้นสร้างผลเสียอย่างมาก
- แม้ภายในโค้ดจะใช้ชื่อคลาสแบบสุ่ม แต่กลับไม่เข้าใจว่าทำไมถึงยังเลือกใช้ชื่อทั่วไปในระดับโกลบอล
- โค้ดนี้ยังถูกแทรกแม้จะไม่ได้ใช้งานส่วนขยายจริง ๆ
บทสรุปและข้อเสนอ
- ผู้เขียนได้ติดต่อ Grammarly แล้ว และแม้จะได้รับการตอบกลับอย่างรวดเร็ว แต่ก็ยังไม่ได้คุยกับผู้รับผิดชอบที่เข้าใจปัญหาเชิงเทคนิค
- แนวทางแก้ที่เหมาะสมที่สุดคือ Grammarly ควรใช้ชื่อตัวแปรอย่าง
--🤡 แทน และปล่อยให้นักพัฒนาคนอื่นสามารถใช้ --rem ได้อย่างอิสระ
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ปัญหาส่วนขยายของฉันต่างออกไปเล็กน้อย เราปล่อยส่วนขยายที่ช่วยให้สลับระหว่างพร็อกซีเซิร์ฟเวอร์ได้ง่ายเพื่อทดสอบตำแหน่งทางภูมิศาสตร์
เวลาจะ inject สคริปต์หรือสไตล์เข้าไปในหน้าที่ไม่รู้จัก อย่างน้อยที่สุดก็ควรใส่ namespace ให้ตัวแปร นี่คือมารยาทพื้นฐาน
น่ากลัวที่เห็นว่าการแชร์หน้าจอและการบันทึกจำนวนมากมีการบุกรุกสีเขียวในทุกเว็บไซต์เป็นค่าเริ่มต้น
ฉันเป็นวิศวกรของ Grammarly Extension ขอโทษที่ทำ UX ของ dbushell.com พัง
ฉันได้ส่งปัญหานี้ต่อให้ทีมวิศวกรรมแล้ว
Google Translate ก็มีปัญหาคล้ายกันที่ทำให้เว็บแอปของฉันพัง
ระหว่างทำงานมี sentry error จำนวนมากที่เกี่ยวข้องกับส่วนขยายเบราว์เซอร์
ฉันสงสัยว่าตัวแปรไหนจะทำเว็บพังได้มากที่สุด
ฉันสงสัยว่าคนอื่นจัดการกับส่วนขยายเบราว์เซอร์ที่เป็นปฏิปักษ์อย่างไร
ฉันสงสัยว่าวิธีนี้สามารถใช้ hijack ปลั๊กอินได้หรือไม่