4

Я пытаюсь запретить определенному сайту использовать 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 .

Кто-нибудь знает как это сделать?

2 ответа2

4

Единственный надежный способ - написать собственное дополнение к Firefox. Greasemonkey не может этого сделать, потому что JavaScript, такой как beforeunload , не может блокировать перенаправления window.location = "..." .

Тем не менее, я заблокировал сайты, чтобы сделать это с помощью NoScript и / или RequestPolicy. Ни один из подходов не идеален, но они могут работать на вас.

  • В идеале используйте NoScript, чтобы заблокировать JS для сайта. Это остановит window.location.
    Многие сайты работают приемлемо без JS. Если этот сайт действительно нуждается в JS, то NoScript не поможет вам с проблемой местоположения. Но NoScript, как и AdBlock, отлично подходит для ускорения работы в сети и сокращения расходов.

  • Следующим возможным исправлением является использование RequestPolicy. RequestPolicy может блокировать только запросы от site_A к site_B, например (при разрешении site_B в других обстоятельствах).

    Это будет работать до тех пор, пока window.location относится к странице на другом сайте. Если это тот же сайт, то единственной альтернативой является пользовательское дополнение.

    Помните, что по умолчанию RequestPolicy закрывает почти все и требует от вас внесения в белый список приемлемых сайтов. Это означает, что требуется немало обучения / настройки.

    Хорошая часть заключается в том, что он может остановить практически все махинации между сайтами, которые широко распространены в Интернете - именно так Facebook, Google и т.д. Отслеживают каждый ваш шаг и как совершается множество угроз безопасности.

  • Если первые 2 варианта не будут работать, то есть еще одна возможность:

    1. Сохраните копию всех JS страницы, которые вы хотите / нуждаетесь.
    2. Удалите все плохие части.
    3. Загрузите этот JS в скрипт GM с помощью директивы // @require или просто вставьте код.
    4. Затем используйте NoScript, чтобы полностью остановить JS страницы. Это нормально, потому что GM JS будет работать, даже если NoScript блокирует JS страницы.
    5. Единственным недостатком является то, что иногда JS страницы потребуется рефакторинг для портирования на сценарий GM. Однако, в большинстве случаев он сразу же появится.

  • Если ничего из вышеперечисленного не работает, вы можете написать собственное дополнение к FF.

0

Хотя это не решение 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));

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .