Firefox: Desativar window.location no site


4

Estou tentando impedir que um determinado site possa usar o javascript para redirecionar o navegador para outra página. O script em questão é um script embutido, portanto o Greasemonkey e o adBlock não podem fazer nada a respeito.

As políticas de segurança configurável (CAPS) parecem ser a resposta, mas não consigo fazê-lo funcionar window.locatione todas as minhas pesquisas não estão sendo úteis. O script fica assim:

<script>
        window.location = "someotherpage.html";
</script>

E foi isso que tentei no meu arquivo 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");

Eu o testei em uma página hospedada localmente e consegui bloquear a função de alerta, mas nada que tentei foi capaz de desativar window.location.

Alguém sabe como fazer isso?


Apenas uma sugestão: se você está lidando com pessoas que clicam dessa maneira, o que você realmente precisa não é uma solução de software, é uma pessoa diferente e mais honesta para fazer negócios. Você pode levar semanas para implementar uma solução, e o proprietário do site descobrirá que o clickjack está bloqueado e encontrará outra maneira de ferrar você. Encontre um site melhor, encontre pessoas melhores, a vida é curta demais para ser desperdiçada com doninhas.

Respostas:


0

Embora não seja uma solução do Firefox para o seu problema, que tal uma solução alternativa?

No Opera, tudo que você precisa é de uma regex simples que encontre e substitua o script. Nenhuma extensão complexa, apenas um arquivo JS de usuário simples, que se pareceria com isso.

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));

1
Então, pesquisei no Google o evento Opera ... Acontece que ele realmente existia no Firefox desde a versão 4. developer.mozilla.org/en-US/docs/DOM/… . Chamar e.stopPropagation e e.preventDefault interrompe a execução do script.
Telanor

@Telanor Nice! Embora se o script tiver mais código que o window.location, você pode encontrar e substituir em vez de parar o script inteiro.
XP1

4

A única maneira infalível é escrever seu próprio complemento do Firefox. O Greasemonkey não pode fazer isso porque javascript, como beforeunload, não pode bloquear window.location = "..."redirecionamentos.

No entanto, impedi que sites fizessem isso usando NoScript e / ou RequestPolicy . Nenhuma das abordagens é perfeita, mas elas podem funcionar para você.

  • Idealmente, use o NoScript para bloquear o JS do site. Isso interromperá o local da janela.
    Muitos sites funcionam de maneira aceitável sem JS. Se este site realmente precisar de JS, o NoScript não o ajudará com o problema de localização. Mas o NoScript, como o AdBlock, é ótimo para acelerar a rede e reduzir o lixo.

  • A próxima correção possível é usar RequestPolicy . RequestPolicy pode bloquear apenas solicitações de site_A para site_B, por exemplo (enquanto permite site_B em outras circunstâncias).

    Isso funcionará enquanto window.locationestiver em uma página em outro site. Se for o mesmo site, o complemento personalizado é a única alternativa.

    Lembre-se de que RequestPolicy encerra quase tudo, por padrão, e requer que você aceite sites aceitáveis. Isso significa que requer um pouco de treinamento / configuração.

    A parte boa é que ele pode parar praticamente todas as travessuras entre sites que existem na Web - que é como o Facebook, o Google etc. rastreiam todos os seus movimentos e como são realizadas muitas explorações de segurança.

  • Se as 2 primeiras opções não funcionarem, outra possibilidade é:

    1. Salve uma cópia de todas as JS da página que você deseja / precisa.
    2. Edite as partes ruins.
    3. Carregue essa JS no script GM usando a // @requirediretiva ou cole apenas o código.
    4. Em seguida, use o NoScript para parar completamente o JS da página. Isso é bom porque o GM JS será executado, mesmo que o NoScript bloqueie o JS da página.
    5. A única desvantagem é que, às vezes, o JS da página precisará ser refatorado para portar para o script GM. Na maioria das vezes, ele aparece logo no entanto.

  • Se nenhuma das opções acima funcionar, sua única opção é escrever seu próprio complemento FF.


O NoScript não funcionaria porque o site em questão requer a execução de javascript e o RequestPolicy também não funcionará porque o site é redirecionado para outra página no mesmo site.
Telanor

Eu adicionei outra abordagem. O JS GM será executado, mesmo que o NoScript bloqueie o JS da página. Isso significa que você pode usar o NoScript e apenas substituir o JS da página pelas suas versões higienizadas. Caso contrário, sua única alternativa é escrever seu próprio complemento.
Brock Adams

@ Telanor, parece muito trabalho para o Firefox. No Opera, tudo que você precisa é de uma regex simples que encontre e substitua o script. Nenhuma extensão complexa, apenas um arquivo JS de usuário simples.
XP1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.