Расширение Chrome - Политика безопасности контента - выполнение встроенного кода

Я использую внешнюю библиотеку JavaScript в моем расширении chrome. У меня встроенное выполнение, поэтому я получаю следующую ошибку

(Ошибка, которую я получаю на консоли)

Отказался от выполнения JavaScript-URL, поскольку он нарушает следующие Политика политики безопасности содержимого: "script -src 'self' chrome-extension://". Либо ключевое слово "небезопасное-встроенное", либо хэш ('sha256 -...'), или nonce ('nonce -...') требуется для включения встроенного выполнение.

В сообщении об ошибке четко указано, что существует возможность работы.

Политика безопасности Chrome-контента говорит, что это невозможно. Многие связанные вопросы цитировали эту ссылку.

Блог Этот блоггер говорит, что это возможно, но, вероятно, это применимо только к более раннему расширению хрома.

Возможна любая работа?

PS: не хочу/не могу изменить всю используемую библиотеку.

EDIT: как использовать хеш или nonce для включения встроенного исполнения.

Ответ 1

Нет, это не возможно, чтобы ослабить эту политику. unsafe-inline специально игнорируется расширениями Chrome начиная с версии 2 манифеста.

Документация (выделено мной):

Не существует механизма для ослабления ограничения на выполнение встроенного JavaScript. В частности, установка политики сценариев, включающей "unsafe-inline", не будет иметь никакого эффекта.

В сообщении об ошибке упоминается несколько возможных способов, но в документах ясно, что ни один CSP не разрешит встроенные сценарии, и игнорирование unsafe-inline является лишь одной из мер.

Обновить

Начиная с Chrome 46, встроенные сценарии могут быть внесены в белый список, указав в политике base-закодированный хэш исходного кода. Этот хэш должен иметь префикс с помощью используемого алгоритма хэширования (sha256, sha384 или sha512). Посмотрите использование Хэша для элементов для примера.

Смотрите этот ответ для более глубокого взгляда на белый список.

Ответ 2

Скопировано из моего ответа на аналогичный вопрос здесь. Для последних версий Chrome (46+) текущий ответ больше не соответствует действительности. unsafe-inline прежнему не действует (как в манифесте, так и в meta заголовка), но в соответствии с документацией вы можете использовать описанную здесь методику, чтобы ослабить ограничение.

Использование хэша для элементов <script>

Директива script-src позволяет разработчикам вносить в белый список конкретный встроенный скрипт, указывая его хэш в качестве разрешенного источника скрипта.

Использование просто. Сервер вычисляет хэш содержимого конкретного скрипта и включает кодировку base64 этого значения в заголовок Content-Security-Policy:

Content-Security-Policy: default-src 'self';
                     script-src 'self' https://example.com 'sha256-base64 encoded hash'

В качестве примера рассмотрим:

manifest.json:

{
  "manifest_version": 2,
  "name": "csp test",
  "version": "1.0.0",
  "minimum_chrome_version": "46",
  "content_security_policy": "script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='",
  "background": {
    "page": "background.html"
  }
}

background.html:

<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <script>alert('foo');</script>
  </body>
</html>

Результат:
alert dialog from inline script

Я также протестировал помещение соответствующей директивы в meta вместо манифеста. Хотя CSP, указанный в консольном сообщении, действительно содержит содержимое тега, он не будет выполнять встроенный скрипт (в Chrome 53).

новый background.html:

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv="Content-Security-Policy" content="script-src 'self' 'sha256-WOdSzz11/3cpqOdrm89LBL2UPwEU9EhbDtMy2OciEhs='">
  </head>
  <body>
    <script>alert('foo');</script>
  </body>
</html>

Результат:
console error messages about content security policy

Ответ 3

У меня возникла эта проблема после того, как я добавил простой флажок на странице входа в систему, чтобы переключить видимость пароля, и вот как я исправил свою проблему, надеюсь, это поможет;

  • Я прекратил использовать событие onclick своего флажка, который вызывал эту проблему в режиме инкогнито chrome, и вместо этого дал идентификатор моему флажку.

До

<div class="form__row">
        <div class="form__controls">
            <label class="checkbox"><input type="checkbox" onclick="togglePasswordVisibility()"> Show password</label>
        </div>
    </div>

После

<div class="form__row">
        <div class="form__controls">
            <label class="checkbox"><input type="checkbox" id="checkboxTogglePasswordVisibility"> Show password</label>
        </div>
    </div>
  • Я создал файл Script.js и добавил в него метод прослушивания событий для обработки события onclick моего флажка для выполнения работы.

Не забудьте сослаться на свой файл JS, если вы еще этого не сделали. Вы можете просто сослаться на это так.

<script src="../Scripts/Script.js"></script>

А вот прослушиватель событий, который я добавил в свой Script.js.

$(document).ready(function () {
    addEventListenerForCheckboxTogglePasswordVisibility()
});

function addEventListenerForCheckboxTogglePasswordVisibility() {
    var checkbox = document.getElementById("checkboxTogglePasswordVisibility");
    if (checkbox !== null) {
        checkbox.addEventListener('click', togglePasswordVisibility);
    }
}

function togglePasswordVisibility() {
    var passwordElement = document.getElementById("password");
    if (passwordElement.type === "password") {
        passwordElement.type = "text";
    } else {
        passwordElement.type = "password";
    }
}

Ошибка до исправления;

enter image description here