Jak wyłączyć CSP w Firefoksie tylko dla bookmarkletów?

26

Dzisiaj zauważyłem, że nie jestem w stanie uruchomić bookmarkletów na https://github.com/ z powodu ograniczeń Content Security Policy (CSP). Czy istnieje sposób na wyłączenie CSP w Firefoksie tylko dla bookmarketów, a nie wszystkiego innego?

Zauważyłem security.csp.enableopcję w about:config, ale to całkowicie wyłączałoby CSP. Następujący komunikat jest rejestrowany w konsoli podczas aktywacji bookmarkletu:

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
źródło

Odpowiedzi:

8

Możesz spróbować przekonwertować swoje bookmarklety na skrypty użytkownika GreaseMonkey. Działają w uprzywilejowanym środowisku i nie podlegają CSP.

Jednak oczywiście zamierzenia skryptów użytkownika i skryptozakładek są różne - skrypty użytkownika uruchamiają się automatycznie, a skryptozakładki na żądanie. Możesz to obejść, np. Tworząc <button>skrypt użytkownika, dołączając go do strony i ustawiając onclickdetektor zdarzeń na tym przycisku, aby uruchamiał kod bookmarkletu.

Kod powinien wyglądać następująco:

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

Zaczerpnąłem prawie dosłownie z mojego skryptu użytkownika, który jest również skierowany do GitHub. Możesz debugować skrypty użytkownika w Firebug za pomocą debugger;słowa kluczowego w skrypcie.

Zauważ jednak, że sam Firebug również podlega CSP, więc nie możesz np. Wykonywać kodu w konsoli (ale możesz sprawdzać skrypty użytkowników w trybie „tylko do odczytu”). Ten błąd rozwiązuje ten problem .

jakub.g
źródło
1
Funkcja na żądanie jest bardzo ważna. Mam bookmarklety, które wstawiają szybki eval-textarea z niektórymi funkcjami, które nie wypełniają dużej części strony, jedną do tworzenia kodu QR dla bieżącej strony i innymi mniejszymi częściami. Nie są one specyficzne dla GH. Moc zakładek jest taka, że ​​można je bardzo łatwo tworzyć i usuwać. GreaseMonkey został już zainstalowany, ale to nie rozwiąże problemu CSP. Dzięki za sugestie, być może rozwiązanie Firebug przyniesie również korzyść w przypadku bookmarkletów.
Lekensteyn,
4
Niestety poprawka Firebug naprawi tylko samą Firebug. Z wpisu na blogu Github na temat CSP : Jak wynika ze specyfikacji CSP, CSP nie powinno mieć wpływu na bookmarklety przeglądarki. (..) Ale żadna z przeglądarek nie dostała tego poprawnie. Wszystkie powodują naruszenia CSP i uniemożliwiają działanie bookmarkletu. Być może powinieneś dokładnie zbadać sprawę i zgłosić problem w Bugzilli.
jakub.g
2
BTW możesz użyć GM_registerMenuCommand, aby wywołać funkcję na żądanie. Nie zapomnij @grant GM_registerMenuCommand. Dodaje wpis do menu Greasemonkey, dostępny pod (GM logo) > User Script Command.... W ten sposób możesz łatwo przekonwertować swoje bookmarklety na skrypty użytkowników.
jakub.g
Nie rozumiem ... utworzenie przycisku na stronie, aby załadować kod po kliknięciu, nie działa, nadal zgłasza wyjątek CSP
Michael
7

Github mówi, że powinien działać zgodnie ze specyfikacją, ale żadna przeglądarka nie działa poprawnie:

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

Powinieneś otworzyć błąd w swojej ulubionej przeglądarce dotyczący tego problemu lub zagłosować na:

cweiske
źródło
2
Dla przypomnienia, istnieje inny błąd Firefoksa, szczególnie w zakresie podstawowej funkcjonalności bookmarkletu (mniej prawdopodobne, że
utknie
Aby zapisać innym kliknięcie, błąd 1478037 wspomniany przez @djpohly w powyższym komentarzu dotyczy umożliwienia działania bookmarkletów, o ile nie obciążają one zasobów zewnętrznych.
waldyrious
1

Wiele odpowiedzi poleca skrypty użytkownika (takie jak TamperMonkey lub GreaseMonkey), ale chcę pamiętać, że niektóre strony znajdują się na czarnej liście z jakiegoś powodu z powodu tych rozszerzeń. (Oczywiście, możesz zastąpić czarną listę, ale twórcy mieli na myśli bezpieczeństwo i zablokowali te strony).

Na przykład chciałem użyć bookmarkletu, aby szybko przejść do ReviewMeta z dowolnego wpisu Amazon, ale Amazon zablokował niezabezpieczone źródła skryptów (aktualizacja: nie został zablokowany, ale nie miałem włączonego skryptu, szkoda). Rozszerzenia skryptów użytkownika są domyślnie umieszczone na czarnej liście w witrynach bankowych i sklepowych, aby zapobiec instalowaniu / używaniu skryptów złośliwych użytkowników.

(PS. Nie jest to odpowiedź sama w sobie, ale pomyślałem, że warto o tym pamiętać, zanim zdobędziesz skrypt użytkownika, aby znaleźć stronę na czarnej liście i waham się przed jej usunięciem z listy).

DBX12
źródło
0

Utworzyłem obejście tego problemu za pomocą skryptu użytkownika Greasemonkey (w przeglądarce Firefox). Możesz teraz mieć bookmarklety na wszystkich stronach CSP i https: //, a także mieć bookmarklety w ładnym, łatwo edytowalnym pliku bibliotecznym, zamiast być pojedynczo ułożonymi w zakładkę.

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

William Donnelly
źródło
-1

Jeśli chcesz uruchomić swoje bookmarklety na stronach internetowych obsługujących CSP w Firefoksie, możesz użyć arkuszy stylów CSS, zobacz moją odpowiedź na StackOverflow .

niutech
źródło