首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Protractor测试HTTP标头:(X-)Content-Security-Policy

使用Protractor测试HTTP标头:(X-)Content-Security-Policy
EN

Stack Overflow用户
提问于 2015-04-26 04:35:38
回答 1查看 1.3K关注 0票数 1

有没有办法用Protractor测试随HTML主页一起发送的HTTP标头?具体地说,我想测试以确保存在与安全相关的(X-)Content-Security-Policy头:

代码语言:javascript
复制
Content-Security-Policy: default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self'; font-src 'self';

理想情况下,我希望能够测试它的效果,而不仅仅是它的存在,因为这样可以更好地确保页面按照我想要的方式运行。

EN

回答 1

Stack Overflow用户

发布于 2015-04-26 16:43:15

下面的代码似乎(至少部分地)测试(在Chrome中)是否存在script-src 'self',因为它测试了注入的内联脚本是否可以运行。所以实际测试的值是不包含unsafe-inline*

代码语言:javascript
复制
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);
});

测试CSP意味着我们不能运行unsafe-eval代码有点棘手。因为内联脚本是被禁止的,所以我不能在运行时将eval的用法注入页面。我这样做的方法是在服务器/test-eval.js上放置一个包含以下内容的文件(感谢AngularJS源代码提供的一种方法)

代码语言:javascript
复制
try {
  new Function('');
}
catch(e) {
  window.caught = true;
}

然后在测试运行时将其添加到DOM:

代码语言:javascript
复制
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而言,它被视为不同的域)。

代码语言:javascript
复制
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还是*)

代码语言:javascript
复制
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)");
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29870440

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档