2015-04-25 1 views
1

Есть ли способ проверить HTTP-заголовки, отправленные вместе с главной HTML-страницей с помощью Protractor? В частности, я хотел бы проверить, чтобы обеспечить безопасность связанных (X-) Content-Security-Policy заголовок присутствует:Проверьте HTTP-заголовки с помощью Protractor: (X-) Content-Security-Policy

Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; font-src 'self'; 

В идеале, я хотел бы быть в состоянии проверить его влияние, а не только его присутствие, так как это будет лучше следить за тем, как страница ведет себя так, как я ее хочу вести.

+0

Добавить " webdriver ", так как я думаю, что эта функция для управления браузером, скорее всего, придет оттуда. (Я бы добавил тег самостоятельно, но не знал, какой тег вы хотите удалить.) –

+0

@ P.T. Готово, спасибо! (Добавлен Selenium для хорошей оценки ... Если они не совсем лучшие теги, не стесняйтесь их редактировать) –

ответ

1

Ниже представлен (по крайней мере, частично) тест (в 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)"); 
}); 
Смежные вопросы