Что такое HTTP-заголовок «Upgrade-Insecure-Requests»?

221

Я сделал запрос POST на сайт HTTP (не HTTPS), проверил запрос в Chrome Developer Tools и обнаружил, что он добавил свой собственный заголовок перед отправкой на сервер:

Upgrade-Insecure-Requests: 1

После выполнения поиска Upgrade-Insecure-Requestsя могу только найти информацию о сервере, отправляющем этот заголовок:

Content-Security-Policy: upgrade-insecure-requests

Это кажется связанным, но все же сильно отличающимся, поскольку в моем случае КЛИЕНТ отправляет заголовок в Запросе , тогда как вся информация, которую я нашел, касается СЕРВЕРА, отправляющего связанный заголовок в Ответе .


Так почему же Chrome (44.0.2403.130 m) добавляет Upgrade-Insecure-Requestsк моему запросу и что он делает?


Обновление 2016-08-24:

Этот заголовок с тех пор был добавлен как Рекомендация кандидата W3C и теперь официально признан.

Для тех, кто только что столкнулся с этим вопросом и смущен, превосходный ответ Саймона Востока это хорошо объясняет.

Upgrade-Insecure-Requests: 1Заголовок , используемый как HTTPS: 1 в предыдущей W3C Working Draft и был переименован спокойно на Chrome до изменения стало официально принято.

(Этот вопрос задавался во время этого перехода, когда не было официальной документации по этому заголовку, и Chrome был единственным браузером, который отправил этот заголовок.)

user193130
источник
1
Firefox тоже это делает.
Дакаб
Должно быть новым; Сначала я занимаюсь разработкой для Firefox, и этот заголовок определенно не был отправлен из Firefox в прошлом году.
user193130

Ответы:

274

Краткий ответ: он тесно связан с Content-Security-Policy: upgrade-insecure-requestsзаголовком ответа, указывая на то, что браузер его поддерживает (и на самом деле предпочитает).

Это заняло у меня 30 минут поиска в Google, но я наконец нашел его в спецификации W3.

Путаница возникает из-за того, что заголовок в спецификации был HTTPS: 1, и именно так Chromium реализовал его, но после того, как это сломало множество плохо кодированных веб-сайтов (особенно WordPress и WooCommerce), команда Chromium извинилась:

«Я извиняюсь за поломку; я, очевидно, недооценил влияние, основанное на обратной связи во время разработки и бета-тестирования».
- Майк Уэст, в выпуске Chrome 501842

Их исправление состояло в том, чтобы переименовать его Upgrade-Insecure-Requests: 1, и спецификация с тех пор была обновлена, чтобы соответствовать.

Во всяком случае, вот объяснение из спецификации W3 (как оно появилось в то время) ...

Поле HTTPSзаголовка HTTP-запроса отправляет серверу сигнал, выражающий предпочтение клиента для зашифрованного и аутентифицированного ответа, и что он может успешно обработать директиву upgrade-insecure-запросы , чтобы сделать это предпочтение как можно более незаметным.

...

Когда сервер встречает это предпочтение в заголовках HTTP-запроса, он ДОЛЖЕН перенаправить пользователя на потенциально безопасное представление запрашиваемого ресурса.

Когда сервер встречает это предпочтение в заголовках HTTPS-запроса, он ДОЛЖЕН включать Strict-Transport-Securityзаголовок в ответ, если хост запроса является HSTS-безопасным или условно HSTS-безопасным [RFC6797].

Саймон Ист
источник
1
Я не понимаю этого. Я a.comи перенаправлю вас b.com, предоставив этот заголовок b.comи отправив некоторую информацию. Если вы не находитесь в безопасном канале b.com, уже может произойти нюхательная атака, потому что я отправил данные b.comвместе с моим запросом. Можете ли вы привести нас к простому сценарию, как сделать соединения более безопасными для пользователей?
Саид Нимати
@SaeedNeamati При очень строгой перспективе это не делает ничего более безопасным. Если у вас нормальные требования к безопасности, вы должны сначала подключиться через HTTPS и не полагаться на это. При этом я бы описал это в контексте идеи « Доверие при первом использовании », которая действительно помогает пассивно.
TNE
1
Я вижу это скорее как желание клиента, чем как инструмент безопасности. Это похоже на заголовок «DNT», сервер может его игнорировать, но все же он выражает желание клиента.
Дузун
Мой ответ может быть улучшен, чтобы правильно объяснить, как клиент и сервер согласовывают это. Не стесняйтесь предлагать улучшения, если хотите.
Саймон Ист
5

Это объясняет все это:

Директива HTTP-Content-Security-Policy (CSP) upgrade-insecure-запросы предписывает агентам пользователя обрабатывать все небезопасные URL-адреса сайта (те, которые обслуживаются по HTTP), как если бы они были заменены на безопасные URL-адреса (те, которые обслуживаются по HTTPS). Эта директива предназначена для веб-сайтов с большим количеством небезопасных устаревших URL-адресов, которые необходимо переписать.

Директива upgrade-insecure-reports оценивается перед block-all-mixed-content, и если она установлена, последняя фактически не работает. Рекомендуется устанавливать одну или другую директиву, но не обе.

Директива upgrade-insecure-reports не гарантирует, что пользователи, посещающие ваш сайт по ссылкам на сторонних сайтах, будут обновлены до HTTPS для навигации верхнего уровня и, таким образом, не заменят заголовок Strict-Transport-Security (HSTS), который должен по-прежнему быть установлен с соответствующим максимальным возрастом, чтобы гарантировать, что пользователи не будут подвергаться атакам разборки SSL.

Источник: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/upgrade-insecure-requests

Василий Муса
источник