Як я не можу запобігти ін'єкції "Читайте більше: www.site.com" не JavaScript-кодом в дії копіювання та вставки?


30

Існує багато сайтів, які вставляють у буфер обміну щось на кшталт "Детальніше: www.site.com", коли ви копіюєте текст у своєму браузері. Я вважаю це огидним. Пошук у Google виявляє деякі способи зупинити це, якщо веб-сайт використовує сервіс Tynt (просто заблокувавши домен Tynt), але багато веб-сайтів використовують домашній JavaScript.

Чи існує загальний спосіб блокувати цю поведінку, окрім просто вимкнення JavaScript? Я використовую Chrome, але мене цікавлять усі рішення.

РЕДАКТУВАННЯ: Щоб було зрозуміло, я хочу мати можливість зберігати решту функціональних можливостей JavaScript для цих веб-сайтів, оскільки багато хто з них не буде працювати.

EDIT № 2: Ось два приклади веб-сайтів, які продовжують мене переслідувати, незважаючи на те, що я використовую блокатор Tynt: Marginal Revolution | Фіскальний час

Ось два запитання щодо StackOverflow та два дописи в блогах, які пояснюють способи втілення цієї тінистої практики вручну без Tynt. Ось допис у блозі, де описано, наскільки важко це надійно блокувати. Ось остання дискусія, яку я міг знайти (березень 2013 р.), Яка пропонує пропозиції щодо блокування цього в Chrome за допомогою AdBlock, але це не спрацювало для мене.

Відповіді:


24

На сайті, який додає дратівливих матеріалів "Читати далі", це ShareThis.

Щоб запобігти цій поганій поведінці, у вас є три різні варіанти:

Вимкнення подій буфера обміну

Ці веб-сайти використовують API буфера обміну , що дозволяє веб-розробникам перехоплювати дії копіювання / вирізання / вставки та виконувати деякий код під час їх виконання. Так працює ShareThis (та інші подібні веб-сайти). Він просто чекає події копіювання і безпосередньо перед виконанням ефективної копії додає додатковий "шар" тексту, який містить дратує "- Дивіться ...".

Тепер питання: чи існує якийсь метод відключення подій буфера обміну? На жаль, мені не вдалося знайти спосіб зробити це в Chrome / Chromium, але в Firefox це можливо двома різними способами.

  • Увійдіть about:configі шукайте dom.event.clipboardevents.enabled. Двічі клацніть по клавіші (встановіть її false) і вуаля! Ви відключили події буфера обміну, і ніхто більше не торкнеться цього буфера обміну.
  • Для старих версій Firefox (дійсно, дуже старших) є таке розширення, яке робить саме те саме, що є about:configопцією.

Вимкнення подій буфера обміну не повинно завдати шкоди досвіду будь-якого веб-сайту, оскільки вони рідко використовуються і насправді не існує їхньої мети (крім спаму).

Перейдемо до другого рішення.

Блокувати ShareThis

Якщо вам не потрібен ShareThis, ви можете просто заблокувати w.sharethis.comдомен. Javascript, відповідальний за завантаження ShareThis (та реєстрацію його ClipboardEvent), завантажується з цього веб-сайту.

Ви можете заблокувати його різними способами, починаючи від простого фільтра AdBlock і редагуючи файл хостів (це не охоплено і не пов'язано, оскільки я не можу розміщувати більше посилань через свою репутацію).

Приклад виконання цього hostsфайлу:

127.0.0.1 w.sharethis.com

Третє рішення - найскладніше, і його слід використовувати лише в крайньому випадку.

Вимкніть функцію вибору на проблемних веб-сайтах

Для редагування вмісту, скопійованого в буфер обміну, на цих веб-сайтах використовується SelectionAPI, який дозволяє їм редагувати виділення на ходу. Отже, рішення - повністю відключити будь-який тип Selection(очевидно, на стороні коду. Ви все одно зможете виконувати вибір).

Це можна зробити за допомогою простого сценарію Tampermonkey / Greasemonkey. Я перевірив його лише на Firefox, оскільки зараз не можу встановити Chrome. Мені про це шкода.

Це вихідний код:

// ==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);
})();

Щоб дозволити цьому працювати, вам слід створити новий сценарій Greasemonkey / Tampermonkey і відкоригувати @includeдирективи. Ви можете розміщувати один веб-сайт на рядок, і це потрібно робити так @include http://bad.website.address/.

Я перевірив це на обох веб-сайтах, які ви пов’язали, і він працює без проблем. Однак майте на увазі, що це може спричинити проблеми, оскільки Selections використовуються ідеально законними веб-сайтами (наприклад, текстові поля StackExchange використовують їх для вставки символу при натисканні на кнопку в положення вашої карети), тому вам слід увімкнути що користувач сценарій лише на проблемних веб-сайтах.

(зауважте, що вам може знадобитися видалити рядки, починаючи з того, //якщо ви створюєте користувацький сценарій із меню Greasemonkey / Tampermonkey, вони автоматично додадуть його)

Пояснення користувацького сценарію досить просте. По-перше, він визначає функцію з назвою, disableSelectionsяка замінює за замовчуванням document.getSelectionі window.getSelectionфункції на ту, яка просто повертає об'єкт, що містить { isCollapsed: true }. Чому? Оскільки ShareThis (я перевірив їхній JS-код) викликає цю функцію та перевіряє, чи встановлено isCollapsedвластивість true(якщо воно є, воно зупиняє "отруєння буфера обміну"). Інші подібні веб-сайти, можливо, не виконають цю перевірку, але вони виявляться просто помилкою при спробі викликати законну функцію Selectionоб'єкта.

Потім функція вводиться в тіло / заголовок / документ, і вона буде автоматично виконуватися. Питання, яке ви можете задати, таке: якщо Javascript дозволяє переосмислити (майже) кожну функцію, чому ви не замінили addEventListenerфункцію просто нічого не робити, коли подія копіює / вирізає / вставляє? Відповідь досить проста. Користувальний сценарій виконується в непросто передбачуваний час, це означає, що ShareThis Javascript можна завантажити перед користувачем, і він нічого не зробить. Натомість, просто скасувавши window.getSelectionфункцію, не виникне жодних проблем, оскільки ця функція викликається лише тоді, коли виконується копія, і ми на 100% впевнені, що при копіюванні тексту користувальницький сценарій вже завантажений.

Висновок

Найкраще і найчистіше рішення, очевидно, перше, оскільки воно вимикає практично марний API.

Другий теж дійсний, але ви втратите будь-яку функціональність ShareThis.

Третій - самий "хакітний", але в крайньому випадку це може спрацювати.


Велике спасибі! Це чудово. Прикро, що це так складно і не має ідеального рішення, але, здається, ваша відповідь є найкращою інформацією, яка наразі доступна в Інтернеті. Дуже рада нагородити вас.
Джесс Рідель

Так, я провів зовсім небагато досліджень, оскільки ця проблема торкнулася і мене. До речі, дякую за виграш - це допоможе моєму «новому» досвіду StackExchange!
Робертоф

Re: Перший, це блокує сайти, де ви можете натиснути кнопку, щоб скопіювати якийсь текст? Наприклад, emojipedia.org/snowman . Емпірично, що у Firefox це не здається. Класно. Re: блокування ShareThis, мій налагоджувач тепер показує завантаження сценаріїв з піддоменів "l.sharethis.com" та "ws.sharethis.com". Тому я думаю, що єдине повне лікування - це блокування повного домену ShareThis.com, що не повинно бути великою втратою. Дякую @Robertof!
Конрад Мейєр

Застереження: відключення подій буфера обміну може призвести до несправності деяких сайтів. Наприклад, він спричиняє збій під час вставки в пошук.
Миколай

2

Ці одіозні дії можна заблокувати в Chrome за допомогою розширення "Kill Evil":

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

(EDIT) Це розширення, як видається, викликає дивні проблеми у фейсбуці, не забудьте додати його до списку.


Відмінно! Я знайшов три розширення, які мають намір вирішити цю проблему: 1. Блокблок Tynt. 2. RightToCopy. 3. Убити зло (завдяки вам, чайка). "Вбивство зла" - це те, що працювало на виправлення особливо неприємних маніпуляцій з буфером обміну на сайті.org.org,
Дейв Бертон,

1
Не хвилюйтесь @DaveBurton - зауважте, що це розширення змушує багато сайтів вести себе досить дивним чином, тому вмикайте його лише тоді, коли вам це потрібно.
Чайка

2
Kill Evil підтримує список виключень або "білий список", який є списком сайтів, для яких ви НЕ хочете, щоб розширення було ввімкнено (тобто список "дозволити зло"). Це було не те, чого я хотів: я просто хочу включити Вбивати зло ТОЛЬКО на певному сайті (phys.org). Тому я закінчив цей хитрий регулярний вираз "негативного пошуку", щоб вимкнути Kill Evil за винятком одного сайту: ^ https?: \ / \ / (?! ([A-zA-Z0-9 \ - \.] * фіз \ .org))
Дейв Бертон

Любіть нахабний шматочок регексу. Дякуємо за публікацію
Чайка

1

Хоча це доповнення Firefox, NoScript дозволяє блокувати JavaScript з будь-якого веб-сайту, встановлюючи непідтверджений список.


2
Дякую за відповідь, але це не те, що мені потрібно. (Я хочу те, що не порушує JavaScript скрізь на сайті.) Я відредагую питання, щоб бути більш конкретним.
Джесс Рідель

1

Якщо ви шукаєте спосіб автоматичної модифікації HTML перед його відображенням, то Greasemonkey - це інструмент, і вам потрібно буде створити користувацький сценарій, який виконує модифікацію.

З статті Посібник для початківців для сценаріїв Greasemonkey в Google Chrome :

Зараз Chrome в оригіналі підтримує сценарії користувачів. Для їх використання не потрібно встановлювати додаткові розширення; насправді Chrome розглядає кожен сценарій користувача як індивідуальний додаток, щоб ви могли легко керувати та видаляти їх.

В Інтернеті є багато інформації про Greasemonkey, включаючи багато навчальних посібників. Більшість з них буде для Firefox, звідки походить Greasemonkey, але вони також сьогодні застосовуються до Chrome.

Оскільки сайт, відповідальний за "Читати далі", є sharethis.com. Якщо заблокувати його, це повинно припинитися. Якщо у вас встановлений пакет безпеки, використовуйте його для блокування сайту. Інакше ви можете заблокувати його за допомогою файлу хостів .

sharethis.comє постачальником, який постачає Tynt на два веб-сайти, які ви мені дали. Tynt виглядає скоріше технологією, ніж веб-сайтом, тому, звичайно, можуть бути й інші подібні провайдери.


Добре, дякую. В принципі практично все, що завгодно на веб-сайті, можна виправити, якщо застосувати сценарій жирної клавіші. (Принаймні, я припускаю, що будь-яку проблему JavaScript можна вирішити більше JavaScript.) Для того, щоб прийняти цю відповідь на суму, мені знадобиться набагато більше інформації про те, як її реалізувати.
Джесс Рідель

Яка інформація? Можна почати з wikipedia, яка дає найважливіші посилання, включаючи wiki та userscripts.org .
harrymc

Скажіть, пояснення того, як працюють не-Tynt-реалізації та що саме буде зроблено щодо них? Поки що нічого, що ви написали, навіть не стосується цієї проблеми копіювання-вставки (а не JavaScript взагалі).
Джесс Рідель

Я ніколи не зустрічався з Tynt (недарма, оскільки я використовую NoScript). З двох прикладних веб-сайтів у статті, з якою ви посилаєтесь, один зник, а другий більше не використовує Tynt. У вас є приклад?
harrymc

Я змінив, щоб додати два приклади веб-сайтів, які продовжують мати таку поведінку, навіть коли я використовую розширення Tynt-block.
Джесс Рідель

1

На Chromium я мав успіх із розширенням Absolute Enable Right Click & Copy .

Встановивши його, ви можете додати до списку користувачів сайти, на яких розширення включено в налаштуваннях. Або коли ви перебуваєте на певній сторінці і бачите, що вона підробляє ваш буфер обміну, ви можете ввімкнути це розширення влітку за допомогою кнопки панелі інструментів (це автоматично додає сайт у ваш список).


0

Крім того, використовуйте розширення "Копіювати як звичайний текст" для Chrome. Потім у вас є додаткова опція в меню, крім звичайного копіювання. Він має перевагу в тому, що він працює в Chrome і нічого не ламає. https://chrome.google.com/webstore/detail/copy-as-plain-text-amazin/mkkcgjeddgdnikkeoinjgbocghokolck?utm_source=chrome-app-launcher-info-dialog


З назви, ви могли б подумати, що вона порушує копіювання форматованого тексту? Це іноді корисно для деяких людей.
Конрад Мейєр
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.