Как определить политику безопасности контента (CSP)
Я заметил, что GitHub и Facebook реализуют эту политику сейчас, что ограничивает запуск сторонних скриптов в рамках своего опыта/сайта.
Есть ли способ определить, работает ли документ с CSP, используя JavaScript?
Я пишу букмарклет и хочу дать пользователю сообщение, если они находятся на сайте, который не поддерживает встраивание тега script.
Ответы
Ответ 1
Как насчет этого. Для медленных соединений время ожидания должно быть увеличено. Onload - это то, что я использовал для его обнаружения, и, похоже, он работает. Если он загружается, то CSP, очевидно, не включен или неправильно настроен.
var CSP = 0;
frame = document.createElement('script');
frame.setAttribute('id', 'theiframe');
frame.setAttribute('src', location.protocol+'//example.com/');
frame.setAttribute('onload', 'CSP=1;');
document.body.appendChild(frame);
setTimeout(function(){if (0 == CSP){alert("CSP IS ENABLED");}}, 250);
Ответ 2
От https://github.com/angular/angular.js/blob/master/src/Angular.js#L1091, функция noUnsafeEval
function noUnsafeEval() {
try {
/* jshint -W031, -W054 */
new Function('');
/* jshint +W031, +W054 */
return false;
} catch (e) {
return true;
}
}
Ответ 3
В настоящее время нет способа сделать это в браузерах доставки.
Однако, что-то вроде следующего должно работать, по спецификации и в Chrome с возможностями экспериментальной веб-платформы, включенными в chrome://flags/
:
function detectCSPInUse() {
return "securityPolicy" in document ? document.securityPolicy.isActive : false;
}
Интерфейс SecurityPolicy
(что вы получаете от document.securityPolicy
, если оно реализовано) содержит несколько атрибутов, которые дают более подробную информацию о что в настоящее время разрешено.
Ответ 4
Легкий способ обнаружения поддержки для CSP - это проверить, может ли JavaScript eval() - метод запускаться без ошибки, например:
try {
eval("return false;");
} catch (e) {
return true;
}
Однако это работает только в том случае, если CSP фактически включен (очевидно), при этом Content-Security-Policy устанавливается в заголовках ответов на загруженной странице и без "небезопасного-eval" в script -src.
Я пришел сюда, чтобы найти способ обнаружения поддержки CSP в браузерах без включения CSP. Казалось бы, это невозможно.
С другой стороны, IE не поддерживает CSP, только директива sandbox в IE 10+, которая, глядя на стандарт CSP, не делает его совместимым веб-браузером.
Ответ 5
От https://hackernoon.com/im-harvesting-credit-card-numbers-and-passwords-from-your-site-here-s-how-9a8cb347c5b5:
fetch(document.location.href)
.then(resp => {
const csp = resp.headers.get('Content-Security-Policy');
// does this exist? Is is any good?
});
Это приведет к ошибке, но с connect-src='none'
и будет сообщено.