Ниже представлен (по крайней мере, частично) тест (в Chrome) наличие script-src 'self'
, в котором он проверяет, можно ли запускать встроенные скрипты. Таким образом, на самом деле проверяет, если значение не содержит unsafe-inline
или *
:
it('should not run injected scripts', function() {
var script = 'window.inlineTagEvaluated = false;';
script += 'var callback = arguments[arguments.length - 1];';
script += 'var script = document.createElement("script");';
script += 'script.text = "window.inlineTagEvaluated = true;";';
script += 'document.head.appendChild(script);'
script += 'callback(window.inlineTagEvaluated);';
expect(browser.executeAsyncScript(script)).toBe(false);
});
Testing, что СНТ означает, что мы не можем запустить unsafe-eval
код немного сложнее. Поскольку встроенный скрипт запрещен, я не могу ввести в таблицу во время использования eval
. То, как я сделал это, чтобы положить файл на сервере /test-eval.js
, который содержит следующее (благодаря источнику AngularJS способ делать это)
try {
new Function('');
}
catch(e) {
window.caught = true;
}
, а затем добавить его в DOM на время выполнения тест:
it('should not run eval-ed scripts', function() {
var script = 'window.caught = false;'
script += 'var callback = arguments[arguments.length - 1];';
script += 'var script = document.createElement("script");';
script += 'script.src = "/eval-test.js";';
script += 'script.onload = function() {callback(window.caught);};';
script += 'script.onerror = function() {callback(window.caught);};';
script += 'document.head.appendChild(script);'
expect(browser.executeAsyncScript(script)).toBe(true);
});
Я должен признать, что я не поклонник того, чтобы иметь что-то на сервере, я проверяю, что это только для тестирования.
Проверка того, что мы не можем запускать скрипты из других доменов, также немного сложна. Для этого я настраиваю HTTP-сервер на время жизни одного теста, обслуживая простой файл Javascript. (Он обслуживается из другого порта с остальной части сайта и поэтому рассматривается как другой домен для целей CSP).
it('should not run scripts from another domain', function() {
function setupServer() {
var defer = protractor.promise.defer();
require('http').createServer(function (request, response) {
response.setHeader('Content-Type', 'application/javascript');
response.end('window.externalScriptEvaluated = true;');
}).listen(8081, function() {
defer.fulfill();
});
return defer.promise;
}
protractor.promise.controlFlow().execute(setupServer);
var script = 'window.externalScriptEvaluated = false;';
script += 'var callback = arguments[arguments.length - 1];';
script += 'var script = document.createElement("script");';
script += 'script.src = "http://localhost:8081/";';
script += 'script.onload = function() {callback(window.externalScriptEvaluated);};';
script += 'script.onerror = function() {callback(window.externalScriptEvaluated);};';
script += 'document.head.appendChild(script);'
expect(browser.executeAsyncScript(script)).toBe(false);
});
Следующая частично проверяет наличие style-src 'self'
, в том, что он проверяет, если встроенные стили могут быть применены (так на самом деле проверяет, если значение не содержит unsafe-inline
или *
)
it('should not use injected styles', function() {
var script = 'document.body.style.backgroundColor = "rgb(0, 1, 1)";';
script += 'var callback = arguments[arguments.length - 1];';
script += 'var style = document.createElement("style");';
script += 'style.type = "text/css";';
script += 'style.appendChild(document.createTextNode("body {background-color: rgb(1, 0, 0) !important}"));';
script += 'document.head.appendChild(style);'
script += 'callback(window.getComputedStyle(document.body).getPropertyValue("background-color"));';
expect(browser.executeAsyncScript(script)).toBe("rgb(0, 1, 1)");
});
Добавить " webdriver ", так как я думаю, что эта функция для управления браузером, скорее всего, придет оттуда. (Я бы добавил тег самостоятельно, но не знал, какой тег вы хотите удалить.) –
@ P.T. Готово, спасибо! (Добавлен Selenium для хорошей оценки ... Если они не совсем лучшие теги, не стесняйтесь их редактировать) –