您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Block unauthorized redirects and prevent history manipulation
当前为
// ==UserScript== // @name Stop Nefarious Redirects // @namespace http://tampermonkey.net/ // @version 4.1 // @description Block unauthorized redirects and prevent history manipulation // @match http://*/* // @match https://*/* // @grant GM_setValue // @grant GM_getValue // @grant GM_xmlhttpRequest // @license MIT // @run-at document-start // ==/UserScript== const manualBlacklist = new Set([ 'getrunkhomuto.info' ]); const allowedPopups = [ '500px.com', 'accuweather.com', 'adobe.com', 'adulttime.com', 'alibaba.com', 'amazon.com', 'amazonaws.com', /* ... */ 'zeplin.iozillow.com', 'zoom.us' ]; (function() { 'use strict'; console.log('Script initialization started.'); /** * Get the current automated blacklist * @returns {Set} The automated blacklist */ function getAutomatedBlacklist() { return new Set(GM_getValue('blacklist', [])); } /** * Add a URL to the automated blacklist * @param {string} url - The URL to add to the blacklist */ function addToAutomatedBlacklist(url) { const encodedUrl = encodeURIComponent(url); const blacklist = getAutomatedBlacklist(); if (!blacklist.has(encodedUrl)) { blacklist.add(encodedUrl); GM_setValue('blacklist', Array.from(blacklist)); console.log('Added to automated blacklist:', url); } } /** * Check if navigation to a URL is allowed * @param {string} url - The URL to check * @returns {boolean} True if navigation is allowed, false otherwise */ function isNavigationAllowed(url) { if (!isUrlBlocked(url)) { console.log('Navigation allowed to:', url); lastKnownGoodUrl = url; return true; } else { console.error('Blocked navigation to:', url); addToAutomatedBlacklist(url); if (lastKnownGoodUrl) { window.location.replace(lastKnownGoodUrl); } return false; } } const originalAssign = window.location.assign.bind(window.location); const originalOpen = window.open; console.log('Original window.location.assign and window.open saved.'); window.location.assign = function(url) { console.log('Redirect attempt detected:', url); if (!allowedPopups.some(domain => url.includes(domain)) && !isNavigationAllowed(url)) { console.log('Redirect to undesired domain blocked:', url); return; } console.log('Redirect allowed to:', url); return originalAssign(url); }; console.log('window.location.assign overridden with custom logic.'); window.open = function(url, name, features) { console.log('Popup attempt detected:', url); if (allowedPopups.some(domain => url.includes(domain)) || isNavigationAllowed(url)) { console.log('Popup allowed for:', url); return originalOpen(url, name, features); } console.log('Blocked a popup from:', url); return null; }; console.log('window.open overridden with custom logic.'); let lastKnownGoodUrl = window.location.href; const locationProxy = new Proxy(window.location, { set(target, prop, value) { if (prop === 'href' || prop === 'assign' || prop === 'replace') { if (!isNavigationAllowed(value)) { return false; } } return Reflect.set(target, prop, value); }, get(target, prop) { if (prop === 'assign' || prop === 'replace') { return function(url) { if (isNavigationAllowed(url)) { return target[prop].call(target, url); } }; } return Reflect.get(target, prop); } }); Object.defineProperty(window, 'location', { configurable: true, enumerable: true, get() { return locationProxy; } }); window.addEventListener('popstate', function(event) { if (!isNavigationAllowed(window.location.href)) { console.error('Blocked navigation to:', window.location.href); history.pushState(null, "", lastKnownGoodUrl); window.location.replace(lastKnownGoodUrl); event.preventDefault(); } }); /** * Handle history manipulation * @param {Function} originalMethod - The original history method * @param {*} data - The state data * @param {string} title - The page title * @param {string|null} url - The URL * @returns {*} The result of calling the original method */ function handleHistoryManipulation(originalMethod, data, title, url) { if (!isUrlBlocked(url)) { return originalMethod.call(history, data, title, url); } console.error('Blocked history manipulation to:', url); } const originalPushState = history.pushState; const originalReplaceState = history.replaceState; history.pushState = function(data, title, url) { return handleHistoryManipulation(originalPushState, data, title, url); }; history.replaceState = function(data, title, url) { return handleHistoryManipulation(originalReplaceState, data, title, url); }; /** * Check if a URL is blocked based on the blacklist * @param {string} url - The URL to check * @returns {boolean} True if the URL is blocked, false otherwise */ function isUrlBlocked(url) { const encodedUrl = encodeURIComponent(url); const automatedBlacklist = getAutomatedBlacklist(); const isBlocked = [...manualBlacklist, ...automatedBlacklist].some(blockedUrl => encodedUrl.includes(blockedUrl)); if (isBlocked) { console.log(`Blocked URL: ${url}`); } return isBlocked; } console.log('Redirect control script with blacklist initialized.'); })();