題 如何防止“閱讀更多:www.site.com”被注入非Tynt JavaScript進行複制粘貼操作?


當您在瀏覽器中復製文本時,有許多網站會在您的剪貼板中插入“Read more:www.site.com”之類的內容。我覺得這很可惡。谷歌搜索顯示 一些  方法 如果網站恰好使用該服務,請停止此操作 Tynt (通過阻止Tynt域名),但許多網站使用自行開發的JavaScript。

除了關閉JavaScript之外,是否有阻止此行為的一般方法?我使用Chrome但我對所有解決方案感興趣。

編輯:要清楚,我希望能夠保留這些網站的其餘JavaScript功能,因為許多網站將在沒有它的情況下破解。

編輯#2:這是兩個示例網站,儘管我使用了一個Tynt攔截器,但仍在繼續騷擾我: 邊緣革命 | 財政時報

這是兩個 堆棧溢出  問題 和兩個 博客  帖子 這解釋了在沒有Tynt的情況下手動實現這種陰暗練習的方法。這裡有一個 博客文章 描述這是多麼難以可靠地阻止。這裡是 最近的討論 我可以找到(2013年3月)提供有關如何使用AdBlock阻止Chrome的建議,但它對我不起作用。


28
2018-01-19 02:10


起源




答案:


添加惱人的“閱讀更多”內容的網站是ShareThis。

為了防止這種不良行為,您有三種不同的選擇:

禁用剪貼板事件

這些網站正在使用 剪貼板API,允許Web開發人員攔截複製/剪切/粘貼操作,並在執行時執行一些代碼。這就是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

第三種解決方案是最難的,它應該僅作為最後的手段使用。

禁用有問題的網站上的選擇功能

要編輯複製到剪貼板的內容,這些網站使用 Selection API,允許他們即時編輯選擇。所以,解決方案是 全然 禁用任何一種 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 賓語。

然後將函數注入到body / header / document中,它將自動執行。你可能會問的一個問題是:如果Javascript允許覆蓋(幾乎)每個函數,為什麼不覆蓋 addEventListener 複製/剪切/粘貼事件時,什麼都不做?答案很簡單。用戶腳本在不容易預測的時間執行,這意味著可以加載ShareThis Javascript 之前 用戶腳本,它不會做任何事情。相反,只是覆蓋了 window.getSelection 函數,因為該函數被調用,所以沒有任何問題 只要 當執行副本時,我們100%確定在復製文本時,usercript已經被加載。

結論

最好和最乾淨的解決方案顯然是第一個,因為它禁用了幾乎無用的API。

第二個也是有效的,但你將失去任何ShareThis功能。

第三個是最“hacky”的,但作為最後的手段它可以工作。


22
2018-01-28 18:28



非常感謝你!這很棒。遺憾的是,這是如此困難並且沒有完美的解決方案,但您的答案似乎是互聯網上目前可用的最佳信息。非常高興為您頒發賞金。 - Jess Riedel
是的,我做了很多研究,因為這個問題也影響了我。謝謝你的賞金 - 這將有助於我的“新人”StackExchange體驗! - Robertof


雖然它是一個Firefox插件, NoScript的 允許您通過設置不受信任的列表來阻止來自任何網站的JavaScript。


2
2018-01-22 00:30



謝謝你的回答,但這不是我需要的。 (我希望在網站上的任何地方都不會破壞JavaScript。)我將編輯問題更具體。 - Jess Riedel


使用“Kill Evil”擴展程序可以阻止Chrome上的這些可惡行為:

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

(編輯)這個擴展似乎在Facebook上引起奇怪的問題,請務必將其列入白名單。


2
2017-12-09 13:45



優秀!我找到了三個旨在解決這個問題的擴展:1。Tynt Blocker。 2. RightToCopy。殺死邪惡(拜託你,海鷗)。 Kill Evil是那個在phys.org上修復特別討厭的剪貼板操作的人, - Dave Burton
不用擔心@DaveBurton - 請注意,此擴展會導致許多網站表現得相當奇怪,所以只有在需要時才啟用它。 - seagull
Kill Evil支持排除列表或“白名單”,這是您不希望啟用擴展名的站點列表(即“允許惡意”列表)。這不是我想要的:我只想在特定網站(phys.org)上啟用Kill Evil。所以我最終得到了這個棘手的“負向前瞻”正則表達式,除了那個站點之外禁用Kill Evil:^ https?:\ / \ /(?!([a-zA-Z0-9 \ - \。] * PHY的\ .org)處理) - Dave Burton
喜歡厚臉皮的厚臉皮。謝謝你發布它。 - seagull


如果您正在尋找一種在顯示HTML之前自動修改HTML的方法, 那麼Greasemonkey就是這個工具,你需要創建一個用戶腳本 做了修改。

從文章 Google Chrome中Greasemonkey腳本初學者指南 :

Chrome現在原生支持用戶腳本。您不必安裝   使用它們的額外擴展;事實上,Chrome會對待每個用戶   腳本作為單獨的插件,因此您可以輕鬆管理和刪除   他們。

有很多關於Greasemonkey的信息可以在互聯網上找到, 包括很多教程。其中大多數都適用於Greasemonkey的Firefox 起源,但他們今天也適用於Chrome。

由於負責“閱讀更多”的網站是 sharethis.com。如果你阻止它,這應該停止。如果您已安裝安全套件,請使用它來阻止該站點。否則你可以 使用您的hosts文件阻止它

sharethis.com 是向您提供給我的兩個網站提供Tynt的提供商。 Tynt看起來更像是一種技術,而不是一個網站,所以當然可能還有其他類似的提供商,但人們不得不希望它們相當罕見。


1
2018-01-22 13:55



好,謝謝。原則上,如果使用greasemonkey腳本,可以修復網站上的任何內容。 (至少,我認為任何JavaScript問題都可以通過更多JavaScript修復。)為了接受這個賞金的答案,我需要更多關於如何實現它的信息。 - Jess Riedel
什麼樣的信息?人們可以從一開始 維基百科 這給出了最重要的鏈接,包括 維基 和 userscripts.org。 - harrymc
比如,解釋非Tynt實現如何工作以及究竟會對它們做些什麼?到目前為止,您所編寫的內容甚至都不是特定於此復制粘貼問題(而不是一般的JavaScript)。 - Jess Riedel
我從未見過Tynt(難怪因為我使用NoScript)。從您鏈接到的文章中的兩個示例網站,一個已經消失,另一個不再使用Tynt。你有一個例子嗎? - harrymc
我做了一個編輯,添加了兩個繼續出現這種行為的示例網站,即使我使用Tynt阻止擴展。 - Jess Riedel


或者,使用Chrome的“複製為純文本”擴展名。除了正常複製之外,您還可以在菜單中選擇其他選項。它具有在Chrome中運行的優點,並且不會破壞任何內容。 https://chrome.google.com/webstore/detail/copy-as-plain-text-amazin/mkkcgjeddgdnikkeoinjgbocghokolck?utm_source=chrome-app-launcher-info-dialog


0
2017-12-15 21:46