web-dev-qa-db-ja.com

Firefox:Webサイトでwindow.locationを無効にする

特定のサイトが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を無効にできませんでした。

誰かがこれを行う方法を知っていますか?

5
Telanor

あなたの問題に対する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));
0
XP1

唯一の確実な方法は、独自のFirefoxアドオンを作成することです。 beforeunloadなどのjavascriptはwindow.location = "..."リダイレクトをブロックできないため、Greasemonkeyはそれを実行できません。

ただし、NoScript および/または RequestPolicy を使用してサイトがこれを実行するのをブロックしました。どちらのアプローチも完璧ではありませんが、うまくいくかもしれません。

  • 理想的には、 NoScript を使用してサイトのJSをブロックします。これにより、window.locationが停止します。
    多くのサイトはJSがなくても問題なく動作します。このサイトが本当にJSを必要としている場合、NoScriptは場所の問題を解決しません。しかし、AdBlockのようなNoScriptは、ネットを高速化し、クラッドを削減するのに最適です。

  • 次に考えられる修正は、 RequestPolicy を使用することです。 RequestPolicyは、たとえばsite_Aからsite_Bへのリクエストのみをブロックできます(他の状況ではsite_Bを許可します)。

    これは、window.locationが別のサイトのページにある限り機能します。同じサイトの場合は、カスタムアドオンが唯一の選択肢です。

    RequestPolicyはデフォルトでほとんどすべてをシャットダウンし、受け入れ可能なサイトをホワイトリストに登録する必要があることに注意してください。これは、かなりのトレーニング/構成が必要であることを意味します。

    良い部分は、ウェブ上で横行しているほぼすべてのクロスサイトスクリプニングを阻止できることです。これは、FacebookやGoogleなどがすべての動きを追跡し、多くのセキュリティエクスプロイトが実行される方法です。

  • 最初の2つのオプションが機能しない場合、別の可能性は次のとおりです。

    1. 必要な/必要なすべてのページのJSのコピーを保存します。
    2. 悪い部分を編集します。
    3. // @requireディレクティブを使用して、そのJSをGMスクリプトにロードするか、コードを貼り付けます。
    4. 次に、NoScriptを使用してページのJSを完全に停止します。 NoScriptがページのJSをブロックしている場合でも、GM JSが実行されるため、これは問題ありません。
    5. 唯一の欠点は、ページのJSがGMスクリプトに移植するためにリファクタリングが必要になる場合があることです。ただし、ほとんどの場合、すぐにドロップインします。

  • 上記のいずれも機能しない場合、唯一のオプションは独自のFFアドオンを作成することです。

4
Brock Adams