我正在尝试阻止某个网站使用 javascript 将浏览器重定向到另一个页面。有问题的脚本是内联脚本,因此 Greasemonkey 和 adBlock 对此无能为力。
可配置安全策略 (CAPS) 似乎是答案,但我无法让它工作window.location
,而且我的所有搜索都没有找到任何有用的信息。脚本如下所示:
<script>
window.location = "someotherpage.html";
</script>
这是我在 user.js 文件中尝试过的:
user_pref("capability.policy.policynames", "noredirect");
user_pref("capability.policy.noredirect.sites", "http://www.zshare.net http://127.0.0.1");
user_pref("capability.policy.noredirect.Window.Location.replace", "noAccess");
user_pref("capability.policy.noredirect.Window.Location.assign", "noAccess");
user_pref("capability.policy.noredirect.Window.Location.reload", "noAccess");
user_pref("capability.policy.noredirect.Window.Location", "noAccess");
user_pref("capability.policy.noredirect.Document.Location.replace", "noAccess");
user_pref("capability.policy.noredirect.Document.Location.assign", "noAccess");
user_pref("capability.policy.noredirect.Document.Location.reload", "noAccess");
user_pref("capability.policy.noredirect.Document.Location", "noAccess");
user_pref("capability.policy.noredirect.Location.replace", "noAccess");
user_pref("capability.policy.noredirect.Location.assign", "noAccess");
user_pref("capability.policy.noredirect.Location.reload", "noAccess");
user_pref("capability.policy.noredirect.Location", "noAccess");
我已经在本地托管的页面上对其进行了测试,并且能够阻止警报功能,但我尝试的任何方法都无法禁用window.location
。
有谁知道如何做到这一点?
答案1
尽管 Firefox 无法解决您的问题,但是有其他解决方案吗?
在 Opera 中,您只需要一个简单的正则表达式来查找和替换脚本。没有复杂的扩展,只有一个简单的用户 JS 文件,如下所示。
Disable redirection 1.00.js
:
// ==UserScript==
// @name Disable redirection
// @version 1.00
// @description Disables redirection.
// @namespace http://superuser.com/questions/353339/firefox-disable-window-location-on-website/511703#511703
// @copyright 2012
// @author XP1
// @homepage https://github.com/XP1/
// @license Apache License, Version 2.0; http://www.apache.org/licenses/LICENSE-2.0
// @include http*://example.com/*
// @include http*://*.example.com/*
// ==/UserScript==
/*
* Copyright 2012 XP1
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*jslint browser: true, vars: true, maxerr: 50, indent: 4 */
(function (opera) {
"use strict";
var isReplaced = false;
function replaceJs(userJsEvent) {
if (isReplaced) {
return;
}
var element = userJsEvent.element;
element.text = element.text.replace(/window\.location = "someotherpage\.html";/g, "");
isReplaced = true;
}
opera.addEventListener("BeforeScript", function listener(userJsEvent) {
if (isReplaced) {
opera.removeEventListener("BeforeScript", listener, false);
return;
}
replaceJs(userJsEvent);
}, false);
}(this.opera));
答案2
唯一万无一失的方法是编写自己的 Firefox 附加组件。Greasemonkey 无法做到这一点,因为 javascript(例如beforeunload
)无法阻止window.location = "..."
重定向。
然而, 我已经使用以下方式阻止网站执行此操作无脚本和/或请求策略。这两种方法都不是完美的,但它们可能对你有用。
理想情况下使用无脚本阻止网站的 JS。这将停止 window.location。
许多网站在没有 JS 的情况下也能正常工作。如果此网站确实需要 JS,那么 NoScript 将无法帮助您解决位置问题。但 NoScript 和 AdBlock 一样,非常适合加速网络并减少垃圾。下一个可能的解决方法是使用请求策略。例如,RequestPolicy 可以仅阻止从 site_A 到 site_B 的请求(而在其他情况下允许 site_B)。
只要是
window.location
指向另一个站点的页面,此方法就有效。如果是同一站点,则自定义附加组件是唯一的选择。请注意,RequestPolicy 默认关闭大多数功能,并要求您将可接受的网站列入白名单。这意味着它需要相当多的培训/配置。
好的方面是,它可以阻止几乎所有在网络上猖獗的跨站点恶作剧——这就是 Facebook、Google 等如何追踪你的一举一动以及许多安全漏洞是如何发生的。
如果前两个选项不起作用,那么另一种可能性是:
- 保存您想要/需要的所有页面 JS 的副本。
- 编辑掉所有不好的部分。
- 使用指令将该 JS 加载到 GM 脚本中
// @require
或直接粘贴代码。 - 然后使用 NoScript 完全停止页面的 JS。这样就可以了,因为即使 NoScript 阻止了页面的 JS,GM JS 仍会运行。
- 唯一的缺点是,有时页面的 JS 需要重构才能移植到 GM 脚本。不过,大多数情况下它都会直接插入。
如果以上方法都不起作用,您唯一的选择就是编写自己的 FF 插件。