Javascript создает отказ в соединении с WebSocket - безопасность содержимого

Попытка открыть соединение WebSocket из браузера с сервером, работающим на localhost: 9000, вот мой код 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 ").

Я думал, что открытие соединения websocket с «self» в этом случае «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

Что могло быть причиной отказа в подключении?


person guilhebl    schedule 24.06.2017    source источник


Ответы (1)


Похоже, что эта страница должна обслуживаться с заголовком ответа 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.

person sideshowbarker    schedule 24.06.2017