ลิงก์กับ target =“ _ blank” และ rel =“ noopener noreferrer” ยังมีช่องโหว่อยู่ไหม


110

ฉันเห็นคนแนะนำว่าเมื่อใดก็ตามที่หนึ่งใช้ในการเชื่อมโยงเพื่อเปิดในหน้าต่างที่แตกต่างกันที่พวกเขาควรใส่target="_blank" rel="noopener noreferrer"ฉันสงสัยว่าสิ่งนี้จะป้องกันไม่ให้ฉันใช้เครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ใน Chrome ได้อย่างไรและลบแอตทริบิวต์ rel จากนั้นคลิกลิงค์ ...

นั่นเป็นวิธีง่ายๆในการรักษาช่องโหว่หรือไม่?


คุณคิดว่ามันจะให้ความคุ้มครองแบบไหน (หรือจะไม่)?

ฉันกำลังพิจารณาส่วนขยายเบราว์เซอร์ที่สามารถจัดการ DOM ได้
Miro J.

1
Firefox 79 จะทำสิ่งนี้โดยอัตโนมัติ ( noopenerอย่างน้อยก็ แต่ตามที่ระบุไว้ด้านล่างnoreferrerคือการแสดงผล): hacks.mozilla.org/2020/07/firefox-79
Kev

คำตอบ:


128

คุณอาจเข้าใจผิดเกี่ยวกับช่องโหว่ คุณสามารถอ่านเพิ่มเติมได้ที่นี่: https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimate-vulnerability-ever/

โดยพื้นฐานแล้วการเพิ่มrel="noopener noreferrer"ลิงก์จะช่วยปกป้องผู้ใช้ไซต์ของคุณจากการที่ไซต์ที่คุณเชื่อมโยงไว้ซึ่งอาจมีการลักลอบใช้เบราว์เซอร์ (ผ่านทาง JS ที่หลอกลวง)

คุณกำลังถามเกี่ยวกับการลบแอตทริบิวต์นั้นผ่านเครื่องมือสำหรับนักพัฒนาซึ่งอาจทำให้คุณ (บุคคลที่ยุ่งเกี่ยวกับแอตทริบิวต์) เท่านั้นที่จะพบช่องโหว่


9
noopener noreferrerซ้ำซ้อนเนื่องจากnoreferrerมีฟังก์ชันของnoopener. html.spec.whatwg.org/multipage/links.html#link-type-noreferrer
mfluehr

1
หากซ้ำซ้อนเหตุใด Visual Studio Code จึงต้องใช้ทั้งสองอย่าง
muhe

66

ลิงก์ที่เชื่อมโยงกับลิงก์target="_blank"เหล่านี้มีความเสี่ยงที่จะมีการสลับหน้าผู้อ้างอิงในพื้นหลังในขณะที่ความสนใจของผู้ใช้ถูกเบี่ยงเบนไปโดยแท็บที่เพิ่งเปิดใหม่ สิ่งนี้เรียกว่าreverse tabnapping :

ตัวอย่างโฟลว์ที่เป็นอันตราย

หน้าอ้างอิงถูกเก็บไว้ในwindow.openerและไซต์ที่เป็นอันตรายสามารถแก้ไขได้ผ่าน:

if (window.opener) {
   window.opener.location = "https://phish.example.com";
}

การเพิ่มrel="noopener noreferrer"แก้ไขช่องโหว่นี้ในเบราว์เซอร์หลักทั้งหมด

โปรดทราบว่าในทางทฤษฎีคุณสามารถลบrel ฝั่งไคลเอ็นต์ผ่านการจัดการ ... แต่ทำไมคุณถึงต้องการ? สิ่งที่คุณทำคือจงใจทำให้ตัวเองเสี่ยงต่อการโจมตี

ผู้ใช้รายอื่นที่เยี่ยมชมเว็บไซต์เดียวกัน (และไม่ได้แก้ไขโค้ดฝั่งไคลเอ็นต์ของตนเอง) จะยังคงปลอดภัยเนื่องจากเซิร์ฟเวอร์จะยังคงให้บริการไฟล์rel="noopener noreferrer". การนำออกของคุณมีผลกับคุณเท่านั้น


เพียงแค่เดิน rel = "noopener noreferrer" ให้ประโยชน์อะไรกับแอปพลิเคชันภายในของฉัน เปิดโดเมนภายในเดียวกันในเครือข่ายภายในเดียวกันมีโอกาส 0 ที่จะอ้างถึงไซต์ภายนอกบางไซต์ และหากยังคงเป็นประโยชน์ทำไมไม่เพิ่มลิงก์ทั้งหมดโดยทั่วไป
Dainius

3

แท็กจุดยึดrel=”noopener”หรือrel=”noreferrer”แอตทริบิวต์ช่วยเพิ่มความปลอดภัยของเว็บไซต์ แต่บางคนต้องการเพิกเฉยเพราะคิดว่าจะส่งผลต่อการเพิ่มประสิทธิภาพเครื่องมือค้นหาเว็บไซต์ แต่นั่นเป็นเพียงตำนาน ปกป้องความลับของผู้ชมเว็บไซต์ของคุณและป้องกันเว็บไซต์ภายนอกโดยการแพร่กระจายโค้ดที่เป็นอันตราย


8
คงจะดีไม่น้อยหากคุณสามารถอ้างอิงแหล่งที่มาของข้อความ "ตำนาน" ได้ โดยเฉพาะอย่างยิ่งสำหรับnoreferrerส่วน
มิโรเจ

1

เกี่ยวกับรายงานการตรวจสอบแนวทางปฏิบัติที่ดีที่สุดของ Lighthouse :

เพิ่มrel="noopener"หรือrel="noreferrer"ลิงก์ภายนอกใด ๆ เพื่อปรับปรุงประสิทธิภาพและป้องกันช่องโหว่ด้านความปลอดภัย

โดยทั่วไปเมื่อคุณใช้target="_blank"ให้เพิ่มrel="noopener"หรือrel="noreferrer" :

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

<a href="https://www.kaiostech.com/store/" target="_blank" rel="noreferrer">
  KaiStore
</a>
  • rel="noopener"ป้องกันไม่ให้เพจใหม่เข้าถึงwindow.openerพร็อพเพอร์ตี้และทำให้แน่ใจว่าเพจทำงานในกระบวนการแยกต่างหาก
  • rel="noreferrer"มีผลเหมือนกัน แต่ยังป้องกันไม่ให้Refererส่วนหัวถูกส่งไปยังเพจใหม่

ดูเอกสารอย่างเป็นทางการสำหรับข้อมูลเพิ่มเติม


เพิ่มทั้งสองอย่างได้ไหม
มีความสุข

-1

หากคอนโซลนักพัฒนาซอฟต์แวร์แสดงคำเตือนเกี่ยวกับnoopener noreferrerตรวจสอบให้แน่ใจว่าคุณได้เพิ่มทั้งสองnoopenerและnoreferrerใน rel ลิงค์ควรมีลักษณะดังนี้:

<a href="www.google.com" target="_blank" rel="noopener noreferrer" />

ดูเหมือนจะไม่ตรงกับคำถามที่ถูกถาม
TylerH
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.