Как определить политику безопасности контента (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);

Ответ 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, не делает его совместимым веб-браузером.