Link z target = „_ blank” i rel = „noopener noreferrer” nadal jest podatny na atak?

109

Widzę, że ludzie zalecają, aby za każdym razem, gdy użyje target="_blank"się linku do otwarcia go w innym oknie, umieść rel="noopener noreferrer". Zastanawiam się, jak to uniemożliwia mi używanie na przykład Narzędzi dla programistów w Chrome i usuwanie atrybutu rel. Następnie kliknij link ...

Czy to łatwy sposób na zachowanie tej luki?

Miro J.
źródło
Jak myślisz, jaki rodzaj ochrony zapewniłby (lub nie dałby w tym przypadku)?
Rozważałem rozszerzenia przeglądarki, które mogą manipulować DOM.
Miro J.
1
Firefox 79 zrobi to automatycznie (cóż, noopenerprzynajmniej, ale jak wskazano poniżej, noreferrerjest rendundant): hacks.mozilla.org/2020/07/firefox-79
Kev

Odpowiedzi:

126

Możesz źle zrozumieć tę lukę. Możesz przeczytać więcej na ten temat tutaj: https://www.jitbit.com/alexblog/256-targetblank---the-most-underestimated-vulnerability-ever/

Zasadniczo dodawanie rel="noopener noreferrer"do linków chroni użytkowników Twojej witryny przed posiadaniem witryny, z którą łączysz się, i potencjalnym przejęciem przeglądarki (przez fałszywy JS).

Pytasz o usunięcie tego atrybutu za pomocą Narzędzi dla programistów - to tylko potencjalnie naraziłoby Ciebie (osobę manipulującą atrybutem) na lukę.

Jon Uleis
źródło
9
noopener noreferrerjest zbędny, ponieważ noreferrerzawiera funkcjonalność noopener. html.spec.whatwg.org/multipage/links.html#link-type-noreferrer
mfluehr
1
jeśli jest nadmiarowy, dlaczego program Visual Studio Code wymaga obu?
muhe
66

Linki z target="_blank"na nich są narażone na zamianę strony odsyłającej w tle, podczas gdy uwaga użytkownika jest odwracana przez nowo otwartą kartę. Jest to znane jako odwrócone tabnapping :

Przykład złośliwego przepływu

Strona odsyłająca jest przechowywana w window.opener, a złośliwa witryna może to zmienić poprzez:

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

Dodanie rel="noopener noreferrer"naprawia tę lukę we wszystkich głównych przeglądarkach.

Zauważ, że teoretycznie możesz usunąć stronę rel klienta poprzez manipulację ... ale dlaczego miałbyś to robić? Wszystko, co robisz, to celowe narażanie się na atak.

Inni użytkownicy, którzy odwiedzają tę samą witrynę (i nie modyfikują własnego kodu po stronie klienta) nadal byliby bezpieczni, ponieważ serwer nadal obsługiwałby rozszerzenie rel="noopener noreferrer". Twoje usunięcie dotyczy tylko Ciebie.

Wiek obsydianu
źródło
po prostu wędruj, jaką korzyść z rel = "noopener noreferrer" daje mojej wewnętrznej aplikacji? Otwiera tę samą domenę wewnętrzną, w tej samej sieci wewnętrznej, jest 0 szans, że będzie odnosić się do jakiejś zewnętrznej strony. A jeśli nadal będzie to korzystne, dlaczego nie dodać go ogólnie do wszystkich linków?
Dainius,
3

Znacznik rel=”noopener”lub rel=”noreferrer”atrybuty kotwicy poprawiają bezpieczeństwo witryny, ale niektórzy ludzie chcą je zignorować, ponieważ sądzą, że wpłyną one na optymalizację ich witryny pod kątem wyszukiwarek, ale to tylko mit. Chroni poufność odbiorców Twojej witryny i zapobiega rozprzestrzenianiu się złośliwego kodu z witryn zewnętrznych.

Kowsigan Atsayam
źródło
8
Byłoby miło, gdybyś zacytował jakieś źródło stwierdzenia „mit”. Szczególnie jeśli chodzi o noreferrerczęść.
Miro J.
1

Odnośnie raportu z audytów Lighthouse Best Practices :

Dodaj rel="noopener"lub rel="noreferrer"do jakichkolwiek linków zewnętrznych, aby poprawić wydajność i zapobiec lukom w zabezpieczeniach.

Generalnie, kiedy używasz target="_blank", zawsze dodawaj rel="noopener"lub rel="noreferrer":

Na przykład:

<a href="https://www.kaiostech.com/store/" target="_blank" rel="noreferrer">
  KaiStore
</a>
  • rel="noopener"uniemożliwia nowej stronie dostęp do window.openerwłaściwości i zapewnia jej uruchomienie w osobnym procesie.
  • rel="noreferrer"ma ten sam efekt, ale także zapobiega Refererwysłaniu nagłówka do nowej strony.

Więcej informacji można znaleźć w oficjalnym dokumencie .

Penny Liu
źródło
Czy możesz dodać oba?
pobłogosławiony
-1

Jeśli konsola programisty wyświetla ostrzeżenie dotyczące noopener noreferrer, upewnij się, że dodajesz oba elementy noopeneri noreferrerrel. link powinien wyglądać jak poniżej:

<a href="www.google.com" target="_blank" rel="noopener noreferrer" />
Yuvraj Patil
źródło
Wydaje się, że nie odnosi się to do zadanego pytania.
TylerH