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

10243
Lekensteyn

Сегодня я заметил, что не могу запускать букмарклеты на 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:... 
22

5 ответов на вопрос

7
cweiske

Github says that it should work according to the spec, but no browser gets it right:

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

You should open a bug for your favorite browser for this issue, or vote for it:

Напомним, что есть еще одна ошибка в Firefox, предназначенная специально для основных функций букмарклетов (менее вероятно, что они увязнут в обсуждении): https://bugzilla.mozilla.org/show_bug.cgi?id=1478037 djpohly 6 лет назад 1
Чтобы сохранить другим щелчок, ошибка 1478037, упомянутая @djpohly в приведенном выше комментарии, позволяет запускать букмарклеты до тех пор, пока они не загружают внешние ресурсы. waldyrious 5 лет назад 0
6
jakub.g

You may try to convert your bookmarklets to GreaseMonkey userscripts. They run in a privileged environment and are not subject to CSP.

However of course intents of userscripts and bookmarklets are different - userscripts run automatically while bookmarklets on-demand. You may circumvent this e.g. by creating a <button> in the userscript, appending it to the page, and setting a onclick event listener on that button to fire the code of the bookmarklet.

Code should go like this:

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

Taken nearly literally from my userscript which is also targeting GitHub. You can debug userscripts in Firebug using debugger; keyword in the script.

Note however that Firebug itself is for now also subject to CSP, so you can't e.g. execute code in console (but you can inspect your userscripts in "read-only" mode). This is being taken care of in this bug.

Функция * по требованию * очень важна. У меня есть букмарклеты, которые вставляют быстрый eval-textarea с некоторыми функциями, которые не заполняют большую часть страницы, один для создания QR-кода для текущей страницы и некоторые другие меньшие части. Они не являются специфичными для GH. Сила букмарклетов в том, что их можно создавать и удалять очень легко. GreaseMonkey уже был установлен, но это не решит проблему CSP. Спасибо за предложения, возможно, решение для Firebug также будет полезным для букмарклетов. Lekensteyn 11 лет назад 1
К сожалению, исправление Firebug исправит только сам Firebug. Из [записи блога Github на CSP] (https://github.com/blog/1477-content-security-policy): * Как ясно указано в спецификации CSP, CSP не должен затрагивать букмарклеты браузера. (..) Но ни один из браузеров не понял это правильно. Все это приводит к нарушениям CSP и препятствует функционированию букмарклета. * Возможно, вам следует более тщательно расследовать дело и сообщить о проблеме на Bugzilla. jakub.g 11 лет назад 4
Кстати, вы можете использовать [GM_registerMenuCommand] (http://wiki.greasespot.net/GM_registerMenuCommand), чтобы вызывать функцию по требованию. Не забывайте `@grant GM_registerMenuCommand`. Он добавляет запись в меню Greasemonkey, доступную в `(логотип GM)> Команда пользовательского скрипта ...`. Таким образом, вы можете легко конвертировать ваши закладки в пользовательские скрипты. jakub.g 11 лет назад 2
Я не понимаю ... создание кнопки на странице для загрузки кода при нажатии не работает, все равно выдает исключение CSP Michael 9 лет назад 0
1
DBX12

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

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

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

0
William Donnelly

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

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

-1
niutech

If you want to run your bookmarklets on CSP-enabled websites in Firefox, you can use CSS stylesheets, see my answer on StackOverflow.

Похожие вопросы