Como desativar o CSP no Firefox apenas para bookmarklets?

26

Hoje, notei que não consigo executar bookmarklets em https://github.com/ devido a restrições da Política de segurança de conteúdo (CSP). Existe uma maneira de desativar o CSP no Firefox apenas para bookmarklets, e não todo o resto?

Percebi a security.csp.enableopção about:config, mas isso desativaria completamente o CSP. A seguinte mensagem é registrada no console ao ativar um bookmarklet:

Timestamp: 04/22/2013 02:39:05 PM
Warning: CSP WARN:  Directive inline script base restriction violated

Source File: https://github.com/
Line: 0
Source Code:
javascript:...
Lekensteyn
fonte

Respostas:

8

Você pode tentar converter seus bookmarklets em scripts de usuário do GreaseMonkey . Eles são executados em um ambiente privilegiado e não estão sujeitos ao CSP.

No entanto, é claro que as intenções dos scripts do usuário e bookmarklets são diferentes - os scripts do usuário são executados automaticamente enquanto os bookmarklets sob demanda. Você pode contornar isso, por exemplo, criando um <button>no script do usuário, anexando-o à página e configurando um onclickouvinte de evento nesse botão para disparar o código do bookmarklet.

O código deve ser assim:

// ==UserScript==
// @name            Name
// @description     Description
// @version         0.1
// @namespace       example.Lekensteyn
// @grant           none
// @include         http*://github.com/*/*/commit/*
// ==/UserScript==

var myBookmarklet = function () {
    // here goes the code of the bookmarklet
};

var newButton = document.createElement('button');
newButton.innerHTML = 'Execute my bookmarklet';

newButton.addEventListener('click', function(evt) {
    myBookmarklet();
});

document.getElementById('someElement').appendChild(newButton);

Retirado quase literalmente do meu script de usuário, que também está direcionado ao GitHub. Você pode depurar scripts de usuários no Firebug usando a debugger;palavra-chave no script.

Observe, porém, que o Firebug em si também está sujeito ao CSP, portanto, você não pode, por exemplo, executar código no console (mas pode inspecionar seus scripts de usuário no modo "somente leitura"). Isso está sendo resolvido neste bug .

jakub.g
fonte
1
O recurso sob demanda é muito importante. Tenho bookmarklets que inserem uma área de avaliação de texto rápida com alguns recursos que não preenchem grande parte da página, um para criar um código QR para a página atual e outras partes menores. Aqueles não são específicos de GH. O poder dos bookmarklets é que eles podem ser criados e removidos com muita facilidade. O GreaseMonkey já estava instalado, mas isso não resolverá o problema do CSP. Obrigado pelas sugestões, talvez uma solução para o Firebug também traga benefícios para bookmarklets.
Lekensteyn
4
Infelizmente, a correção do Firebug corrigirá apenas o próprio Firebug. Na entrada do blog do Github no CSP : Como ficou claro pelas especificações do CSP, os bookmarklets do navegador não devem ser afetados pelo CSP. (..) Mas nenhum navegador está correto. Todos causam violações do CSP e impedem o funcionamento do bookmarklet. Talvez você deva investigar o caso mais detalhadamente e relatar um problema no Bugzilla.
precisa saber é o seguinte
2
BTW, você pode usar GM_registerMenuCommand para fazer uma chamada de função sob demanda. Não se esqueça @grant GM_registerMenuCommand. Ele adiciona entrada ao menu Greasemonkey, acessível em (GM logo) > User Script Command.... Dessa forma, você pode facilmente converter seus bookmarklets em scripts do usuário.
precisa saber é o seguinte
Eu não entendo ... criando um botão na página para carregar o código quando clicado não funciona, ele ainda lança uma exceção CSP
Michael
7

O Github diz que deve funcionar de acordo com as especificações, mas nenhum navegador está certo:

https://github.com/blog/1477-content-security-policy#bookmarklets

Você deve abrir um bug no seu navegador favorito para esse problema ou votar nele:

cweiske
fonte
2
Para o registro, há um outro bug Firefox especificamente para a funcionalidade básica bookmarklet (menos propensos a se atolar em discussão): bugzilla.mozilla.org/show_bug.cgi?id=1478037
djpohly
Para salvar o clique de outros, o erro 1478037 mencionado por @djpohly no comentário acima é sobre permitir que bookmarklets sejam executados desde que eles não carreguem recursos externos.
waldyrious
1

Muitas respostas recomendam scripts de usuário (como TamperMonkey ou GreaseMonkey), mas quero lembrar que algumas páginas estão na lista negra por um motivo por essas extensões. (Claro, você pode substituir a lista negra, mas os desenvolvedores tinham segurança em mente e bloqueavam essas páginas).

Por exemplo, eu queria usar um bookmarklet para ir rapidamente ao ReviewMeta a partir de qualquer listagem da Amazon, mas a Amazon bloqueou fontes de script não seguras (atualização: não foi bloqueada, mas eu não usava nenhum script, é uma pena). As extensões de script do usuário estão na lista negra de sites bancários e de compras por padrão, para impedir a instalação / uso de scripts mal-intencionados.

(PS: essa não é uma resposta em si, mas achei que seria útil ter isso em mente antes de colocar um manuscrito no usuário apenas para encontrar a página na lista negra e hesitar em desmarcá-la.)

DBX12
fonte
0

Eu criei uma "correção" alternativa para esse problema usando um script de usuário Greasemonkey (no Firefox). Agora você pode ter bookmarklets em todos os sites CSP e https: //, além de ter seus bookmarklets em um bom arquivo de biblioteca facilmente editável, em vez de ser compactado individualmente em um marcador.

Consulte: https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J

William Donnelly
fonte
-1

Se você deseja executar seus bookmarklets em sites habilitados para CSP no Firefox, use folhas de estilo CSS, veja minha resposta no StackOverflow .

niutech
fonte