6

尝试打开从浏览器到运行在 localhost:9000 上的服务器的 WebSocket 连接,这是我的 JS 代码:

$( document ).ready(function() {

    var url = "ws://localhost:9000/myapp";
    var connection = new WebSocket(url);

    connection.onopen = function() {
        console.log('WebSocket Open');
    };
    connection.onerror = function(error) {
        console.log('WebSocket Error ', error);
    };
    connection.onmessage = function(event) {
        console.log('WebSocket Msg ', event);
    }

});

但是由于内容安全策略,浏览器拒绝接受连接:

内容安全策略:该页面的设置阻止了在 ws://localhost:9000/myapp ("default-src http://localhost:9000 ")加载资源 。

我认为在这种情况下打开与“self”的 websocket 连接“localhost”是可以接受的,但 Chrome 和 FF 都拒绝连接。我想过放置

<meta http-equiv="Content-Security-Policy" content="default-src http: ws: connect-src ws:">

但它并没有解决问题。

这些是服务器返回的标头:

HTTP/1.1 200 OK
Referrer-Policy: origin-when-cross-origin, strict-origin-when-cross-origin
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self'
X-Permitted-Cross-Domain-Policies: master-only
Date: Sat, 24 Jun 2017 03:39:10 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 2130

什么可能导致连接拒绝?

4

1 回答 1

4

似乎该页面必须使用具有其值的Content-Security-Policy响应标头提供服务。default-src http://localhost:9000

鉴于您永远不能在某处使用 CSP 指令来应用比从其他地方应用的更自由的政策,如果您default-src http://localhost:9000在 CSP 标头中有严格的政策,它将被应用而不是您可能拥有的任何更自由的政策使用meta文档中的元素指定。

请参阅CSP 规范中有关多个策略的讨论

其影响是,将其他策略添加到要强制执行的策略列表中只会进一步限制受保护资源的功能。

所以我认为您可能需要将Content-Security-Policy标头的值更改为default-src http: ws: connect-src ws:. 你不能只用一个meta元素来做到这一点。

于 2017-06-24T03:30:57.067 回答