您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Block unauthorized redirects and prevent history manipulation
当前为
// ==UserScript== // @name Stop Nefarious Redirects // @namespace http://tampermonkey.net/ // @version 3.83 // @description Block unauthorized redirects and prevent history manipulation // @match http://*/* // @match https://*/* // @grant GM_setValue // @grant GM_getValue // @license MIT // @run-at document-start // ==/UserScript== (function() { 'use strict'; // Function to get the current blacklist function getBlacklist() { return new Set(GM_getValue('blacklist', [])); } // Function to add a URL to the blacklist function addToBlacklist(url) { let blacklist = getBlacklist(); if (!blacklist.has(url)) { blacklist.add(url); GM_setValue('blacklist', Array.from(blacklist)); } } // Function to display the blacklist function displayBlacklist() { let blacklist = getBlacklist(); console.log('Current Blacklist:\n' + Array.from(blacklist).join('\n')); } // Debounce function function debounce(func, delay) { let timeoutId; return function(...args) { clearTimeout(timeoutId); timeoutId = setTimeout(() => func.apply(this, args), delay); }; } // Function to handle navigation events const handleNavigation = debounce(function(url) { try { if (!isUrlAllowed(url)) { console.error('Blocked navigation to:', url); addToBlacklist(url); // Add the unauthorized URL to the blacklist if (lastKnownGoodUrl) { window.location.replace(lastKnownGoodUrl); } return false; } else { console.log('Navigation allowed to:', url); lastKnownGoodUrl = url; return true; } } catch (error) { console.error('Error in handleNavigation:', error); } }, 100); let lastKnownGoodUrl = window.location.href; let navigationInProgress = false; // Monitor changes to window.location ['assign', 'replace', 'href'].forEach(property => { const original = window.location[property]; if (typeof original === 'function') { window.location[property] = function(url) { if (!navigationInProgress && handleNavigation(url)) { navigationInProgress = true; setTimeout(() => { navigationInProgress = false; }, 0); return original.apply(this, arguments); } }; } else { Object.defineProperty(window.location, property, { set: function(url) { if (!navigationInProgress && handleNavigation(url)) { navigationInProgress = true; setTimeout(() => { navigationInProgress = false; }, 0); return Reflect.set(window.location, property, url); } }, get: function() { return original; }, configurable: true }); } }); // Enhanced navigation control for back/forward buttons window.addEventListener('popstate', function(event) { if (!navigationInProgress && !isUrlAllowed(window.location.href)) { navigationInProgress = true; setTimeout(() => { navigationInProgress = false; }, 0); event.preventDefault(); } }); // Function to handle history manipulation function handleHistoryManipulation(originalMethod, data, title, url) { if (!isUrlAllowed(url)) { console.error('Blocked history manipulation to:', url); return; } return originalMethod(data, title, url); } // Wrap history.pushState and history.replaceState const originalPushState = history.pushState; const originalReplaceState = history.replaceState; history.pushState = function(data, title, url) { return handleHistoryManipulation.call(history, originalPushState.bind(this), data, title, url); }; history.replaceState = function(data, title, url) { return handleHistoryManipulation.call(history, originalReplaceState.bind(this), data, title, url); }; // Keyboard shortcut listener to display the blacklist document.addEventListener('keydown', function(e) { if (e.ctrlKey && e.shiftKey && e.key.toLowerCase() === 'l') { e.preventDefault(); displayBlacklist(); } }); // Function to check if a URL is allowed based on the blacklist function isUrlAllowed(url) { let blacklist = getBlacklist(); return !blacklist.has(url); } console.log('Redirect control script with blacklist initialized.'); })();