Jak zapobiec iniekcji „Czytaj więcej: www.site.com” skryptem JavaScript innym niż Tynt do operacji kopiuj-wklej?

30

Istnieje wiele witryn, w których podczas kopiowania tekstu w przeglądarce wstawiane jest do schowka coś w rodzaju „Czytaj więcej: www.site.com”. Uważam to za obrzydliwe. Wyszukiwarka Google ujawnia pewne metody, które mogą temu zapobiec, jeśli witryna korzysta z usługi Tynt (po prostu blokując domenę Tynt), ale wiele witryn korzysta z własnego JavaScript.

Czy istnieje ogólny sposób na zablokowanie tego zachowania oprócz wyłączenia JavaScript? Używam Chrome, ale interesują mnie wszystkie rozwiązania.

EDYCJA: Żeby było jasne, chcę móc zachować resztę funkcjonalności JavaScript dla tych stron, ponieważ wiele z nich się bez tego zepsuje.

EDYCJA 2: Oto dwie przykładowe strony internetowe, które nadal mnie nękają, mimo że korzystam z programu blokującego Tynt: Marginal Revolution | The Fiscal Times

Oto dwa pytania StackOverflow i dwa posty na blogu, które wyjaśniają sposoby ręcznego wdrożenia tej podejrzanej praktyki bez Tynta. Oto post na blogu opisujący, jak trudno jest niezawodnie zablokować. Oto ostatnia dyskusja, którą mogłem znaleźć (marzec 2013 r.), Która zawiera sugestie, jak to zablokować w Chrome przy użyciu AdBlocka, ale nie zadziałało to dla mnie.

Jess Riedel
źródło

Odpowiedzi:

24

Witryna dodająca irytujące treści „Czytaj więcej” to ShareThis.

Aby zapobiec temu złemu zachowaniu, masz trzy różne alternatywy:

Wyłącz zdarzenia ze schowka

Strony te używają interfejsów API schowka , które pozwalają twórcom stron internetowych przechwytywać operacje kopiowania / wycinania / wklejania i wykonywanie niektórych kodów podczas ich wykonywania. Tak działa ShareThis (i inne podobne strony). Po prostu czeka na zdarzenie kopiowania i tuż przed wykonaniem efektywnej kopii dodaje dodatkową „warstwę” tekstu, która zawiera irytujące „- Zobacz ...”.

Teraz pytanie brzmi: czy istnieje jakiś sposób na wyłączenie zdarzeń schowka? Niestety nie udało mi się znaleźć metody, aby to zrobić w Chrome / Chromium, ale w Firefoksie jest to możliwe na dwa różne sposoby.

  • Wejdź about:configi wyszukaj dom.event.clipboardevents.enabled. Kliknij dwukrotnie klawisz (ustaw go na false) i voila! Wyłączyłeś zdarzenia ze schowka i nikt nie dotknie twojego schowka ponownie.
  • W starszych wersjach Firefoksa (naprawdę, naprawdę starszych) jest to rozszerzenie, które robi dokładnie to samo z about:configopcją.

Wyłączenie zdarzeń ze schowka nie powinno negatywnie wpłynąć na funkcjonowanie żadnej strony internetowej, ponieważ są one rzadko używane i tak naprawdę nie ma celu ich używania (poza spamowaniem).

Przejdźmy do drugiego rozwiązania.

Zablokuj ShareThis

Jeśli nie potrzebujesz ShareThis, możesz po prostu zablokować w.sharethis.comdomenę. Javascript odpowiedzialny za ładowanie ShareThis (i rejestrację ClipboardEvent) jest ładowany z tej strony.

Możesz go zablokować na różne sposoby, od prostego filtra AdBlock do edycji pliku hosts (nie jest to omówione ani linkowane tutaj, ponieważ nie mogę umieścić więcej linków z powodu mojej reputacji).

Przykład zrobienia tego za pomocą hostspliku:

127.0.0.1 w.sharethis.com

Trzecie rozwiązanie jest najtrudniejsze i powinno być stosowane tylko w ostateczności.

Wyłącz funkcję wyboru na problematycznych stronach internetowych

Aby edytować zawartość kopiowaną do schowka, strony te używają Selectioninterfejsu API, który pozwala im edytować zaznaczenia w locie. Tak więc rozwiązaniem jest całkowite wyłączenie dowolnego rodzaju Selection(oczywiście po stronie kodu. Nadal będziesz mógł dokonywać selekcji).

Można to zrobić za pomocą prostego skryptu Tampermonkey / Greasemonkey. Testowałem to tylko w przeglądarce Firefox, ponieważ nie mogę teraz zainstalować Chrome. Przepraszam za to.

To jest kod źródłowy:

// ==UserScript==
// @name        Goodbye selections
// @namespace   tag: utils
// @include     $put_here_a_website_you'd_like_to_disable_selections$
// @include     $more_websites$
// @version     1
// @grant       none
// ==/UserScript==
(function() {
    var disableSelections = function() {
        document.getSelection = window.getSelection = function() {
            return { isCollapsed: true };
        };
    };
    var script = document.createElement ("script");
    script.appendChild (document.createTextNode ("(" + disableSelections + ")();"));
    (document.body || document.head || document.documentElement).appendChild (script);
})();

Aby to zadziałało, należy utworzyć nowy skrypt Greasemonkey / Tampermonkey i dostosować @includedyrektywy. Możesz umieścić jedną stronę internetową w linii i trzeba to zrobić tak @include http://bad.website.address/.

Przetestowałem to na obu połączonych stronach i działa bez problemów. Należy jednak pamiętać, że może to powodować problemy, ponieważ Selections są używane przez doskonale uzasadnione strony internetowe (na przykład pola tekstowe StackExchange używają ich do wstawiania symbolu, po kliknięciu przycisku, do pozycji twojego karetki), więc powinieneś włączyć że użytkownicy tworzą skrypt tylko na problematycznych stronach internetowych.

(zwróć uwagę, że może być konieczne usunięcie linii zaczynających się od, //jeśli tworzysz skrypt użytkownika z menu Greasemonkey / Tampermonkey, oni automatycznie go dodadzą)

Wyjaśnienie skryptu użytkownika jest dość proste. Najpierw definiuje funkcję o nazwie, disableSelectionsktóra zastępuje wartość domyślną, document.getSelectiona window.getSelectionfunkcje taką, która po prostu zwraca obiekt zawierający { isCollapsed: true }. Czemu? Ponieważ ShareThis (sprawdziłem w kodzie JS) wywołuje tę funkcję i sprawdza, czy isCollapsedwłaściwość jest ustawiona na true(jeśli tak, to zatrzymuje „zatrucie schowka”). Inne strony tego typu mogą nie przeprowadzać tej kontroli, ale po prostu popełni błąd, gdy będą próbować wywołać legalną funkcję Selectionobiektu.

Następnie funkcja jest wstrzykiwana do treści / nagłówka / dokumentu i zostanie wykonana automatycznie. Pytanie, które możesz zadać, to: jeśli JavaScript pozwala zastąpić (prawie) każdą funkcję, dlaczego nie zastąpiłeś tej addEventListenerfunkcji, aby po prostu nic nie robić, gdy zdarzenie jest kopiowane / wycinane / wklejane? Odpowiedź jest dość prosta. Skrypt użytkownika jest wykonywany w trudnym do przewidzenia czasie, co oznacza, że ​​skrypt JavaScript ShareThis można załadować przed skryptem użytkownika i nic nie zrobi. Zamiast tego, po prostu nadpisując window.getSelectionfunkcję, nie będzie żadnego problemu, ponieważ funkcja ta jest wywoływana tylko wtedy, gdy wykonywana jest kopia, a my jesteśmy w 100% pewni, że po skopiowaniu tekstu skrypt użytkownika został już załadowany.

Wniosek

Najlepsze i najczystsze rozwiązanie jest oczywiście pierwsze, ponieważ wyłącza praktycznie bezużyteczne API.

Drugi jest również ważny, ale utracisz dowolną funkcjonalność ShareThis.

Trzeci jest najbardziej „hacking”, ale w ostateczności może się udać.

Robertof
źródło
Dziękuję Ci bardzo! To jest doskonałe. Szkoda, że ​​jest to tak trudne i nie ma idealnego rozwiązania, ale twoja odpowiedź wydaje się być najlepszą informacją, która jest obecnie dostępna w Internecie. Bardzo miło przyznać nagrodę.
Jess Riedel
Tak, przeprowadziłem sporo badań, ponieważ ten problem dotyczył również mnie. Nawiasem mówiąc, dziękuję za nagrodę - pomoże to mojemu nowemu nowicjuszowi w StackExchange!
Robertof
Re: po pierwsze, czy to blokuje witryny, w których można kliknąć przycisk, aby skopiować tekst? Np . Emojipedia.org/snowman . Empirycznie w Firefoksie nie wydaje się. Fajne. Re: blokowanie ShareThis, mój debugger wyświetla teraz skrypty ładujące się z subdomen „l.sharethis.com” i „ws.sharethis.com”. Myślę więc, że jedynym pełnym lekarstwem jest zablokowanie pełnej domeny ShareThis.com, co nie powinno być wielką stratą. Dzięki @Robertof!
Conrad Meyer,
Uwaga: wyłączenie zdarzeń schowka może spowodować nieprawidłowe działanie niektórych witryn. Na przykład powoduje awarię Discorda podczas wklejania do wyszukiwania.
Nicholas
2

Te ohydne działania można zablokować w Chrome za pomocą rozszerzenia „Kill Evil”:

https://chrome.google.com/webstore/detail/kill-evil/epieehnpcepgfiildhdklacomihpoldk

(EDYCJA) To rozszerzenie powoduje dziwne problemy na Facebooku, pamiętaj o dodaniu go do białej listy.

mewa
źródło
Doskonały! Znalazłem trzy rozszerzenia, które mają rozwiązać ten problem: 1. Tynt Blocker. 2. RightToCopy. 3. Kill Evil (dzięki tobie, mewa). Kill Evil to ten, który pracował nad naprawą szczególnie paskudnych manipulacji w schowku na phys.org,
Dave Burton
1
nie martw się @DaveBurton - pamiętaj, że to rozszerzenie powoduje, że wiele stron zachowuje się dość dziwnie, więc włącz je tylko wtedy, gdy jest to potrzebne.
mewa
2
Kill Evil obsługuje listę wykluczeń lub „białą listę”, która jest listą witryn, dla których NIE chcesz, aby rozszerzenie było włączone (tj. „Lista dozwolonych zła”). Nie tego chciałem: chcę po prostu włączyć Kill Evil TYLKO na określonej stronie (phys.org). Skończyło się na tym trudnym wyrażeniu regularnym „negatywne spojrzenie w przyszłość”, aby wyłączyć Kill Evil z wyjątkiem tej jednej witryny: ^ https?: \ / \ / (?! ([A-zA-Z0-9 \ - \.] * * phys \ .org))
Dave Burton
Uwielbiam bezczelne wyrażenie regularne. Dzięki za opublikowanie.
mewa
1

Chociaż jest to dodatek do Firefoksa, NoScript pozwala blokować JavaScript z dowolnej strony internetowej, ustawiając niezaufaną listę.

nieterrorysta
źródło
2
Dzięki za odpowiedź, ale nie tego potrzebuję. (Chcę czegoś, co nie łamie JavaScript wszędzie na stronie). Zredaguję pytanie, aby było bardziej szczegółowe.
Jess Riedel
1

Jeśli szukasz sposobu na automatyczną modyfikację kodu HTML przed jego wyświetleniem, to Greasemonkey jest narzędziem i musisz utworzyć skrypt użytkownika, który dokonuje modyfikacji.

Z artykułu Przewodnik dla początkujących dla skryptów Greasemonkey w Google Chrome :

Chrome natywnie obsługuje teraz skrypty użytkownika. Nie musisz instalować dodatkowego rozszerzenia, aby z nich korzystać; w rzeczywistości Chrome traktuje każdy skrypt użytkownika jako osobny dodatek, dzięki czemu można łatwo nim zarządzać i usuwać.

W Internecie można znaleźć wiele informacji na temat Greasemonkey, w tym wiele samouczków. Większość z nich byłaby przeznaczona dla Firefoksa, z którego pochodzi Greasemonkey, ale mają one również zastosowanie do Chrome.

Ponieważ strona odpowiedzialna za „Czytaj więcej” jest sharethis.com. Jeśli go zablokujesz, powinno się to skończyć. Jeśli masz zainstalowany pakiet zabezpieczeń, użyj go do zablokowania witryny. W przeciwnym razie możesz go zablokować za pomocą pliku hosts .

sharethis.comjest dostawcą, który dostarcza Tynt do dwóch stron, które mi dałeś. Tynt wygląda raczej na technologię niż na stronę internetową, więc oczywiście mogą istnieć inni dostawcy, ale trzeba mieć nadzieję, że będą raczej rzadkie.

harrymc
źródło
Ok dzięki. Zasadniczo wszystko na stronie może zostać naprawione, jeśli zastosuje się skrypt fatmonkey. (Przynajmniej zakładam, że jakikolwiek problem z JavaScriptem może zostać rozwiązany przez większą liczbę skryptów JavaScript.) Aby zaakceptować tę odpowiedź za nagrodę, potrzebuję znacznie więcej informacji na temat jej implementacji.
Jess Riedel
Jakie informacje? Można zacząć od wikipedii, która zawiera najważniejsze linki, w tym wiki i userscripts.org .
harrymc
Powiedzmy, wyjaśnienie, w jaki sposób działają implementacje inne niż Tynt i co dokładnie można by z nimi zrobić? Jak dotąd nic, co napisałeś, nie jest specyficzne dla tego problemu z kopiowaniem i wklejaniem (zamiast ogólnie JavaScript).
Jess Riedel
Nigdy nie spotkałem Tynta (nic dziwnego, odkąd używam NoScript). Z dwóch przykładowych stron internetowych w artykule, do którego linkujesz, jedna zniknęła, a druga już nie używa Tynta. Czy masz przykład?
harrymc
Dokonałem edycji, aby dodać dwie przykładowe strony internetowe, które nadal zachowują się tak, nawet gdy używam rozszerzenia blokującego Tynt.
Jess Riedel
1

Na Chromium miałem sukces z rozszerzeniem Absolute Enable Right Click & Copy .

Po zainstalowaniu możesz dodać listę użytkowników witryn, w których rozszerzenie jest włączone w preferencjach. Lub, gdy jesteś na określonej stronie i widzisz, że manipuluje ona w twoim schowku, możesz włączyć to rozszerzenie w locie za pomocą przycisku paska narzędzi (powoduje to automatyczne dodanie witryny do listy).

Ruslan
źródło
0

Możesz też użyć rozszerzenia „Kopiuj jako zwykły tekst” dla Chrome. Następnie masz w menu dodatkową opcję oprócz normalnego kopiowania. Ma to tę zaletę, że działa w Chrome i niczego nie psuje. https://chrome.google.com/webstore/detail/copy-as-plain-text-amazin/mkkcgjeddgdnikkeoinjgbocghokolck?utm_source=chrome-app-launcher-info-dialog

juliański
źródło
Od nazwy, pomyślałbyś, że przerywa kopiowanie sformatowanego tekstu? Czasami jest to przydatne dla niektórych osób.
Conrad Meyer,