Запрос смешанного содержимого со страницы HTTPS на адрес локального хоста HTTP (не HTTPS) не блокируется

Предположим, что страница ниже загружена из https://127.0.100.1. Страница делает от XMLHttpRequest до http://127.0.100.2. Это похоже на смешанное содержание: страница загружается через безопасное соединение, а ресурс загружается через небезопасное соединение. Смешанный контент должен блокироваться браузером. Тем не менее, страница ниже работает просто отлично.* Почему это работает: Почему запрос не блокируется?

Обновление: выходит за рамки принятого ответа, браузеры можно настроить для блокировки смешанного контента для таких адресов.

* Wireshark подтверждает, что браузеры не загружают ресурс через безопасное соединение.

<html>
<body>
<img id="dst"/>
<script>
  let xhr = new XMLHttpRequest();
  xhr.open('get', 'http://127.0.100.2/img.jpg');
  xhr.responseType = 'blob';
  xhr.onload = function(){
    document.getElementById('dst').src = URL.createObjectURL(xhr.response);    
  }
  xhr.send();
</script>
</body>
</html>

person user2768    schedule 28.02.2020    source источник
comment
@sideshowbarker Ваш ответ кажется правильным. априорно аутентифицированный URL-адрес означает, что мы априори знаем, что запрос к определенному URL-адресу... будет доставлен таким образом, чтобы снизить риск перехвата и модификации, включая URL-адреса. из потенциально заслуживающего доверия URL, где потенциально заслуживающий доверия URL включает в себя источник которого является потенциально заслуживающим доверия источником и потенциально заслуживающим доверия источником является тот, которому пользовательский агент обычно может доверять как безопасная доставка данных, в том числе, когда компонент хоста источника соответствует одной из нотаций CIDR 127.0.0.0/8 или ::1/128   -  person user2768    schedule 28.02.2020
comment
Такое поведение делает тестирование довольно проблематичным! @sideshowbarker Есть ли разумный способ проверить такое поведение при запуске веб-сайтов на локальном хосте?   -  person user2768    schedule 28.02.2020
comment
Можно поподробнее, что вы подразумеваете под «способом проверки такого поведения»? Я предполагаю, что вы не имеете в виду способ проверить, что хост находится в диапазоне 127.0.0.0 - 127.255.255.255 (потому что это кажется легко проверяемым). Итак, может быть, вы имеете в виду, есть ли способ проверить, считается ли URL-адрес безопасным контекстом или нет? Если да, то нет, спецификации и платформа не определяют какой-либо API для браузеров, который можно было бы использовать для проведения какого-либо тестирования? Или, если это не то, что вы имеете в виду, то, пожалуйста, уточните.   -  person sideshowbarker    schedule 28.02.2020
comment
@sideshowbarker Я должен был быть более ясным: как я могу изменить свою среду тестирования, чтобы увидеть блокировку смешанного контента?   -  person user2768    schedule 28.02.2020
comment
Я думаю, что вы не можете изменить свою среду тестирования, чтобы увидеть блокировку смешанного контента — по крайней мере, не в том смысле, в каком я полагаю, вы имеете в виду. Это не заметно из внешнего кода JavaScript. В основном все, что вы можете сделать, это что-то вроде теста на https://wpt.live/mixed-content/imageset.https.sub.html делает. В противном случае, находясь вне браузера, вы сможете делать больше, используя Selenium/WebDriver.   -  person sideshowbarker    schedule 28.02.2020
comment
@sideshowbarker что-то вроде того, что делает тест на wpt.live/mixed-content/imageset.https.sub.html, было бы идеально. Но как я могу сделать это, используя 127.0.100.1 и 127.0.100.2, учитывая, что блокировка смешанного содержимого для них не работает?   -  person user2768    schedule 28.02.2020


Ответы (1)


http://127.0.100.2/img.jpg не считается смешанным содержимым, поскольку спецификация Mixed Content определяет его как особый случай априорно аутентифицированный URL, так как он находится в диапазоне 127.0.0.0–127.255.255.255 (то есть хост с нотацией CIDR 127.0.0.0 /8), что соответствует согласно спецификации безопасных контекстов. определяется как безопасный контекст, даже если протокол не https.

То же самое касается http://localhost/img.jpg или http://foo.localhost/img.jpg.

person sideshowbarker    schedule 02.03.2020