Предоставляет ли политика безопасности контента блокировку букмарклетов?
Используется ли Mozilla блок CSP для выполнения Javascript из закладки по умолчанию?
Можно ли настроить это?
Ответы
Ответ 1
По состоянию на 2017 год ответ по-прежнему является окончательным "возможно" - точно так же, как когда этот ответ был первоначально опубликован в 2011 году. спецификация ясно говорит:
Политика, применяемая к ресурсу, НЕ ДОЛЖНА вмешиваться в работу функций пользовательского агента, таких как аддоны, расширения или букмарклеты.
И это действительно то поведение, которое я вижу в Chrome 61: букмарклет будет работать на https://addons.mozilla.org/, сайте, который имеет строгую безопасности контента без script-src: 'unsafe-inline'
. Тем не менее, в Firefox 56 букмарклеты не будут запускаться на этом веб-сайте и сообщается о нарушении CSP.
Существует очень длинная дискуссия по этому вопросу в отчет об ошибке Firefox, в частности, ссылка на аналогичное обсуждение спецификации W3C. Таким образом, на данный момент вы не можете полагаться на независящие от CSP букмарклеты. Вы всегда можете отключить CSP в целом, но для этого один важный уровень защиты меньше.
Ответ 2
Поведение задается в вики mozillas.
CSP не должен вмешиваться в работу пользовательских сценариев (таких как надстройки браузера и букмарклеты).
Посмотрите здесь:
https://wiki.mozilla.org/Security/CSP/Specification#Non-Normative_Client-Side_Considerations
Ответ 3
Да, CSP блокирует закладки в Mozilla Firefox. Существует ошибка об ошибке.
Тем не менее, вы можете обойти это ограничение, введя код JS во внешнюю таблицу стилей CSS, например, Верхний лист новостей новостей:
Внешний CSS:
#topnewsfeed { font-family: '(function(){/*payload*/})()'; }
Закладка JS:
(function() {
var a = document.createElement("link");
a.rel = "stylesheet";
a.href = "//niutech.github.io/topnewsfeed/topnewsfeed.css";
a.onload = function() {
var a = b.currentStyle ? b.currentStyle.fontFamily : document.defaultView.getComputedStyle(b, null).fontFamily;
eval(a.replace(/^["']|\\|["']$/g, ""));
};
document.body.appendChild(a);
var b = document.createElement("div");
b.id = "topnewsfeed";
document.body.appendChild(b);
})()
Закладок загружает файл CSS, содержащий JS-код, добавляет элемент, созданный этим CSS, читает атрибут стиля элемента и eval
код.
Ответ 4
Я создал обходное исправление для этой проблемы, используя регистрационный файл Greasemonkey (в Firefox). Теперь вы можете иметь букмарклеты на всех сайтах CSP и https://, а также иметь ваши закладки в хорошем, легко редактируемом библиотечном файле вместо того, чтобы быть индивидуально зажатым в закладки.
Смотрите: https://groups.google.com/d/msg/greasemonkey-users/mw61Ynw5ORc/Gl_BNUhtSq0J
Ответ 5
Как заблокировать запуск букмарклетов на моей веб-странице?