Отладка нарушения 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 и адреса в одном домене?