Отладка нарушения CSP в Google Chrome

Я пытаюсь использовать TinyMCE при использовании следующего HTTP-заголовка Content-Security-Policy:

X-WebKit-CSP: default-src 'self'; script-src 'self' 'unsafe-eval'; img-src *; media-src *; frame-src *; font-src *; style-src 'self' 'unsafe-inline'; report-uri /:reportcspviolation

Я получаю следующие ошибки в Инструменты - Консоль JavaScript:

Refused to execute JavaScript URL because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 about:blank:1
Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 test.xhtml:1
Refused to execute JavaScript URL because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 about:blank:1
Refused to execute inline event handler because it violates the following Content Security Policy directive: "script-src 'self' 'unsafe-eval'".
 test.xhtml:1

Однако в test.xhtml нет исполняемого кода test.xhtml поскольку он использует только внешний <script> для работы с заданным заголовком CSP. Ссылка на about:blank также недействительна.

Любые идеи, как выяснить, где причина нарушения CSP?

Похоже, что внутренний JS-отладчик Chrome не определяет источник.

Кроме того, по какой-то причине Chrome отображает отчеты о нарушениях CSP как "Ожидание" в разделе "Инструменты" - "Инструменты разработчика" - "Сеть", но проверка данных для отправки не дает никакой дополнительной информации. Пример:

{"csp-report":{"document-uri":"about:blank","referrer":"url-of/test.xhtml","violated-directive":"script-src 'self' 'unsafe-eval'","original-policy":"default-src 'self'; script-src 'self' 'unsafe-eval'; img-src *; media-src *; frame-src *; font-src *; style-src 'self' 'unsafe-inline'; report-uri /:reportcspviolation"}}

Я могу выяснить, что сообщения об ошибках касаются, например, использования атрибута onclick в некотором фрагменте HTML, который TinyMCE загружает на лету, но какой файл искать? Другая ошибка - это, вероятно, фрагмент HTML-кода TinyMCE, в котором некоторый href имеет значение, начинающееся с javascript: но это тоже действительно трудно найти без каких-либо указателей из Chrome. Вся настройка работает с Firefox 13 (используя соответствующий заголовок CSP).

Есть ли способ заставить Chrome генерировать исключение для каждого нарушения CSP?

Ответы

Ответ 1

Если скрипт генерирует новый фрейм (например, about:blank), а затем пытается запустить какой-то код внутри него, Google Chrome не может предоставить ничего значимого ни в консоли, ни в URL-адресе CSP. Все, что вы получаете, это about:blank:1.

Ответ 2

Обязательно отключите все расширения Chrome при тестировании CSP на вашем сайте - расширения AdBlock и PhotoZoom, например, добавьте свои собственные встроенные стили в DOM, которые вызывают нарушение (и последующее попадание в report-uri, если у вас есть эта функция включена, а другие расширения, вероятно, делают то же самое.

Ответ 3

Хотя этот вопрос старый, ответ все тот же. Код по умолчанию, написанный TinyMCE, не соответствует требованиям, отличным от csp.

Tinymce вставляет встроенные css в элементы, которые он добавляет dom. Это не должно быть так, но это так, как они его написали. Вы можете увидеть это, если вы проверите dom с помощью инструментов google или firefox dev, вот один пример, который можно найти в iframe, который он вставляет:

<body spellcheck="false" id="tinymce" class="mce-content-body " onload="window.parent.tinymce.get('story_story').fire('load');" contenteditable="true"><p><br></p></body>

Браузер обнаруживает это и создает отчет о нарушении, поскольку ваш csp этого не позволяет. Существует два способа устранения этой ошибки:

1) добавьте 'inline' или 'unsafe-inline' в ваш csp script -src для этой страницы

или

2) перекодируйте файлы jin файла tinymce. Это потребует, чтобы вы открыли все файлы javascript, изменив код, который он вставляет, чтобы исключить встроенные js-части. Затем эти скрипты должны быть помещены в файлы script, которые вставляются в dom, чтобы код продолжал работать.

Ответ 4

Если домен TinyMCE iframe и домен вашего сайта отличаются не имеют доступа к iframe через javascript и получают сообщение об ошибке в консоли. В этой ситуации ни один заголовок не поможет. Является ли iframe и адреса в одном домене?