Как отключить CSP в Firefox только для букмарклетов?


26

Сегодня я заметил, что не могу запускать букмарклеты на https://github.com/ из-за ограничений Content Security Policy (CSP). Есть ли способ отключить CSP в Firefox только для букмарклетов, а не для всего остального?

Я заметил security.csp.enableпараметр в about:config, но это полностью отключило бы CSP. Следующее сообщение регистрируется в консоли при активации букмарклета:

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:...

Ответы:


8

Вы можете попытаться преобразовать букмарклеты в Greasemonkey userscripts. Они работают в привилегированной среде и не подлежат CSP.

Однако, конечно, намерения пользовательских скриптов и букмарклетов различны - пользовательские скрипты запускаются автоматически, а букмарклеты по запросу. Вы можете обойти это, например, создав пользовательский <button>сценарий, добавив его на страницу и установив onclickпрослушиватель событий для этой кнопки, чтобы запустить код букмарклета.

Код должен идти так:

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

Взято почти буквально из моего пользовательского скрипта, который также нацелен на GitHub. Вы можете отлаживать пользовательские скрипты в Firebug, используя debugger;ключевое слово в скрипте.

Тем не менее, обратите внимание, что Firebug сам по себе также является объектом CSP, поэтому вы не можете, например, выполнить код в консоли (но вы можете проверять свои пользовательские скрипты в режиме «только для чтения»). Об этом позаботятся в этой ошибке .


1
Функция по запросу очень важна. У меня есть букмарклеты, которые вставляют быстрое eval-textarea с некоторыми функциями, которые не занимают большую часть страницы, одна для создания QR-кода для текущей страницы и некоторые другие меньшие части. Они не являются специфичными для GH. Сила букмарклетов в том, что их можно создавать и удалять очень легко. GreaseMonkey уже был установлен, но это не решит проблему CSP. Спасибо за предложения, возможно, решение для Firebug также будет полезным для букмарклетов.
Лекенштейн

4
К сожалению, исправление Firebug исправит только сам Firebug. Из записи блога Github на CSP : Как ясно из спецификации CSP, CSP не должен влиять на закладки браузера. (..) Но ни один из браузеров не понял это правильно. Все они вызывают нарушения CSP и препятствуют функционированию букмарклета. Возможно, вам следует расследовать дело более тщательно и сообщить о проблеме на Bugzilla.
jakub.g

2
Кстати, вы можете использовать GM_registerMenuCommand для вызова функции по требованию. Не стоит забывать @grant GM_registerMenuCommand. Он добавляет запись в меню Greasemonkey, доступный в (GM logo) > User Script Command.... Таким образом, вы можете легко конвертировать ваши закладки в пользовательские скрипты.
jakub.g

Я не понимаю ... создание кнопки на странице для загрузки кода при нажатии не работает, все равно выдает исключение CSP
Майкл

7

Github говорит, что он должен работать в соответствии со спецификацией, но ни один браузер не делает это правильно:

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

Вы должны открыть баг для вашего любимого браузера по этой проблеме или проголосовать за него:


2
Напомним, что есть еще одна ошибка в Firefox, предназначенная специально для базовых функций букмарклетов (менее вероятно, что они увязнут в обсуждении): bugzilla.mozilla.org/show_bug.cgi?id=1478037
djpohly

Чтобы сохранить другим щелчок, ошибка 1478037, упомянутая @djpohly в приведенном выше комментарии, позволяет запускать букмарклеты до тех пор, пока они не загружают внешние ресурсы.
Вальдиро

1

Многие ответы рекомендуют пользовательские скрипты (такие как TamperMonkey или GreaseMonkey), но я хочу помнить, что некоторые страницы занесены в черный список по причине этих расширений. (Конечно, вы можете переопределить черный список, но разработчики имели в виду безопасность и заблокировали эти страницы).

Например, я хотел использовать букмарклет, чтобы быстро перейти к ReviewMeta из любого списка Amazon, но Amazon заблокировал незащищенные источники сценариев (обновление: оно не было заблокировано, но у меня не было сценария, это позор). Расширения пользовательских сценариев помещаются в черный список на банковских и торговых площадках по умолчанию, чтобы предотвратить установку / использование вредоносных пользовательских сценариев.

(PS Это не ответ сам по себе, но я подумал, что было бы полезно иметь это в виду, прежде чем взять в руки пользовательский скрипт, просто чтобы найти страницу в черном списке и не решаясь ее исключить.)


0

Я создал обходное решение для этой проблемы, используя скрипт пользователя Greasemonkey (в Firefox). Теперь вы можете иметь закладки на всех сайтах CSP и https: //, а также иметь закладки в приятном, легко редактируемом файле библиотеки, вместо того чтобы по отдельности помещаться в закладки.

См. Https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J.


-1

Если вы хотите запускать свои букмарклеты на веб-сайтах с поддержкой CSP в Firefox, вы можете использовать таблицы стилей CSS, см. Мой ответ на StackOverflow .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.