Чи зашифровані URL-адреси HTTPS?


1017

Чи зашифровані всі URL-адреси при використанні шифрування TLS / SSL (HTTPS)? Мені хотілося б знати, оскільки я хочу, щоб усі дані URL-адреси були приховані при використанні TLS / SSL (HTTPS).

Якщо TLS / SSL дає вам повне шифрування URL-адрес, мені не доведеться турбуватися про приховування конфіденційної інформації від URL-адрес.


76
Мабуть, погана ідея все-таки вносити конфіденційні дані в URL-адресу. Він відображатиметься і в адресі браузера погано, пам’ятаєте? Людям це не подобається, якщо їх пароль видно кожному, хто випадково погляне на екран. Чому, на вашу думку, потрібно вводити конфіденційні дані в URL?
— jalf

43
URL-адреси також зберігаються в історії браузера та журналах сервера - якби я хотів десь зберігати своє ім’я та пароль, його не було б у цих двох місцях.
— Пісквор вийшов з будівлі

47
Наприклад, припустимо, я відвідую https://somewhere_i_trust/ways_to_protest_against_the_government/. Тоді URL містить конфіденційні дані, а саме пропозицію, яку я розглядаю, протестуючи проти мого уряду.
— Стів Джессоп

42
Я задавав собі це питання, коли робив HTTP-запит із рідного додатка (а не браузера). Я здогадуюсь, це може зацікавити розробників мобільних додатків. У цьому випадку коментарі, які були вище (в той час як істинні), не мають значення (немає URL-адреси, немає історії перегляду), що робить відповідь, на моє розуміння, простим: "Так, це зашифровано".
— DannyA

23
Для тих, хто думає, що коли ви HTTPS, ніхто не знає, куди ви рухаєтесь, прочитайте це спочатку: Ім'я хоста сервера (наприклад, example.com) все ще просочиться через SNI . Це абсолютно не має нічого спільного з DNS і витік стане, навіть якщо ви не використовуєте DNS або не використовуєте зашифрований DNS.
— Pacerier

Відповіді:


912

Так, з'єднання SSL знаходиться між шаром TCP та шаром HTTP. Клієнт і сервер спочатку встановлюють захищений зашифрований TCP-з'єднання (через протокол SSL / TLS), а потім клієнт відправить HTTP-запит (GET, POST, DELETE ...) над цим зашифрованим TCP-з'єднанням.


98
Ще варто відзначити те, що згадував @Jalf у коментарі до самого питання. Дані URL-адрес також зберігатимуться в історії веб-переглядача, що може бути небезпечним у довгостроковій перспективі.
— Майкл Екстранд

20
Не лише GET або POST. Також може бути DELETE, PUT, HEAD або TRACE.

4
Так, це може бути проблемою безпеки для історії браузера. Але в моєму випадку я не використовую браузер (також оригінальний пост не згадував браузер). Використання користувацького https-дзвінка за кадром у рідному додатку. Це просте рішення забезпечити надійне з'єднання вашої програми.
— zingle-dingle

28
Зауважте, що роздільна здатність DNS URL-адреси, ймовірно, не зашифрована. Тож хтось нюхаючи ваш трафік, все-таки може побачити домен, до якого ви намагаєтесь отримати доступ.
— ChewToy

21
SNI розбиває 'хост' частину SSL-шифрування URL-адрес. Ви можете перевірити це самостійно за допомогою проводки. Існує селектор для SNI, або ви можете просто переглянути ваші SSL пакети, коли ви підключитесь до віддаленого хоста.
— cmouse

653

Оскільки ніхто не забезпечив захоплення дротом, ось такий.
Ім'я сервера (доменна частина URL) представлена ​​в ClientHelloпакеті в простому тексті .

Далі показано запит браузера на:
https://i.stack.imgur.com/path/?some=parameters&go=here

КлієнтHello SNI Додаткову інформацію див. У полях версій TLS (їх є 3 - не версії, поля, що містять номер версії!)

З https://www.ietf.org/rfc/rfc3546.txt :

3.1. Вказівка ​​імені сервера

[TLS] не забезпечує механізм для клієнта повідомляти серверу ім'я сервера, з яким він контактує. Клієнтам може бути бажано надати цю інформацію для полегшення безпечного з'єднання з серверами, що розміщують декілька "віртуальних" серверів за однією базовою мережевою адресою.

Для того, щоб вказати ім’я сервера, клієнти МОЖУТЬ включити розширення типу "ім'я_сервера" у (розширений) привіт клієнта.


Коротко:

  • FQDN (частина домену URL-адреси) МОЖЕ бути передано чітко всередині ClientHelloпакета, якщо використовується розширення SNI

  • У решті URL-адреси ( /path/?some=parameters&go=here) немає жодної справи, ClientHelloоскільки URL-адреса запиту - це HTTP (OSI Layer 7), тому він ніколи не відображатиметься в рукостисканні TLS (4 або 5 рівня). Це з’явиться пізніше у GET /path/?some=parameters&go=here HTTP/1.1запиті HTTP, ПІСЛЯ встановлений захищений TLS канал.


РЕЗЮМЕ

Ім’я домену МОЖЕ бути передано чітко (якщо розширення SNI використовується в рукостисканні TLS), але URL-адреса (шлях та параметри) завжди шифрується.


ОНОВЛЕННЯ БЕРЕЗЕНЯ 2019 року

Дякуємо carlin.scott за те, що підняв цей.

Корисне навантаження в розширенні SNI тепер може бути зашифровано за допомогою цього проекту пропозиції RFC . Ця можливість існує лише в TLS 1.3 (як опція, і реалізувати її до обох кінців), і немає зворотної сумісності з TLS 1.2 і нижче.

CloudFlare це робить, і ви можете прочитати більше про внутрішні тут - Якщо курка повинна прийти перед яйцем, куди ви кладете курку?

На практиці це означає, що замість того, щоб передавати FQDN у простому тексті (як показує захоплення Wireshark), він тепер шифрується.

ПРИМІТКА. Це стосується аспекту конфіденційності більше, ніж захисного, оскільки зворотний пошук DNS МОЖЕ виявити призначений хост призначення в будь-якому випадку.


37
Ідеальна відповідь, з повним поясненням від А до Я. Я люблю резюме виконавчого апарату. Зробив мій день @evilSnobu
— oscaroscar

4
Ідеальна відповідь, оновлення! Все ж врахуйте клієнтську частину, оскільки історія браузера може витікати. Однак щодо транспортного шару URL-параметри шифруються.
— Єнс Крейдлер

2
Ви можете оновити цю відповідь тим фактом, що TLS 1.3 шифрує розширення SNI, а найбільший CDN робить саме це: blog.cloudflare.com/encrypted-sni Звичайно, sniffer пакетів може просто зробити пошук зворотного dns для IP-адреси, до яких ви підключаєтесь.
— carlin.scott

@evilSnobu, але ім'я користувача: пароль частина імені користувача: password@domain.com зашифровано, правда? Отож безпечно передавати конфіденційні дані в URL за допомогою https.
— Максим Шаміхулау

1
Вони зашифровані на дроті (на транспорті), але якщо будь-який кінець (користувач чи сервер) записує URL у звичайний текстовий файл і не санітує облікові дані ... тепер це вже інша розмова.
— evilSnobu

159

Як уже вказали інші відповіді , https "URL-адреси" дійсно зашифровані. Однак, ваш запит / відповідь DNS при вирішенні доменного імені, ймовірно, не відповідає, і, звичайно, якщо ви використовували браузер, ваші URL-адреси можуть також бути записані.


21
Запис URL-адрес важливий, оскільки існують хакі Javascript, які дозволяють абсолютно непов'язаному сайту перевірити, чи є вказана URL-адреса у вашій історії чи ні. Ви можете зробити URL-адресу непридатною, включивши в неї довгу випадкову рядок, але якщо це загальнодоступна URL-адреса, зловмисник може сказати, що він був відвіданий, і якщо в ньому є короткий секрет, то зловмисник може жорстоко застосувати з розумною швидкістю.
— Стів Джессоп

8
@SteveJessop, будь ласка, надайте посилання на "
— Pacerier

6
@Pacerier: хакерська дата, звичайно, але я вже говорив про такі речі, як stackoverflow.com/questions/2394890/… . Ще в 2010 році було дуже багато, що ці питання розслідувались, а напади вдосконалювались, але наразі я не дуже слідкую за цим.
— Стів Джессоп

2
@Pacerier: більше прикладів: webdevwonders.com/… , webdevwonders.com/…
— Стів Джессоп

1
Ви можете використовувати OpenDNS із зашифрованою службою DNS. Я використовую його на своєму Mac, але виявив, що версія Windows не працює належним чином. Це було деякий час тому, тому це може працювати добре зараз. Для Linux поки нічого. opendns.com/about/innovations/dnscrypt
— SPRBRN

101

Весь запит і відповідь зашифровані, включаючи URL-адресу.

Зауважте, що при використанні проксі-сервера HTTP він знає адресу (домен) цільового сервера, але не знає запитуваний шлях на цьому сервері (тобто запит і відповідь завжди шифруються).


1
Повний запит. Ім'я хоста надсилається в поле. Все інше зашифровано.
— Сем Сірі

98

Я згоден з попередніми відповідями:

Щоб бути явним:

З TLS перша частина URL-адреси ( https://www.example.com/ ) все ще помітна під час створення з'єднання. Друга частина (/ herearemygetparameters / 1/2/3/4) захищена TLS.

Однак є ряд причин, чому ви не повинні ставити параметри в GET-запиті.

По-перше, як уже згадували інші: - витік через адресний рядок браузера - витік через історію

На додаток до цього у вас є витік URL-адреси через http-реферера: користувач бачить сайт A на TLS, потім натискає посилання на сайт B. Якщо обидва сайти є на TLS, запит на сайт B міститиме повну URL-адресу з сайту A у параметр referer запиту. І адміністратор із сайту B може отримати його з файлів журналу сервера B.)


3
@EJP Ви не зрозуміли, що говорить Тобіас. Він говорить, що якщо ви натиснете посилання на сайт А, який переведе вас на сайт B, то сайт B отримає URL-адресу реферала. Наприклад, якщо ви перебуваєте на сайтіAA?u=username&pw=123123 , то сайтB.com (з яким пов’язано сторінку на сайтіAAAAAAAA) отримає " siteA.com?u=username&pw=123123 " як посилається URL-адреса, надіслана веб-сайту siteB.com всередині HTTPS браузером Якщо це правда, це дуже погано. Це справжній Тобіас?
— trusktr

9
@EJP, домен видно через SNI, який використовують усі сучасні веб-браузери. Також дивіться цю діаграму з EFF, яка показує, що кожен може бачити домен веб-сайту, який ви відвідуєте. Йдеться не про видимість браузера. Йдеться про те, що видно підслуховувачам.
— Буг

10
@trusktr: Браузери не повинні надсилати заголовок Referer зі сторінок HTTPS. Це частина специфікації HTTP .
— Мартін Гейслер

8
@MartinGeisler, Ключове слово "має". Браузери не надто переймаються питанням "повинен" (на відміну від "повинен"). З вашого власного посилання: "настійно рекомендую користувачеві мати можливість вибрати, надсилається чи ні поле Referer. Наприклад, клієнт браузера може мати перемикач перемикань для перегляду відкрито / анонімно, що відповідно б увімкнуло / вимкнуло надсилання Референт та від інформації " . Ops, саме це і зробив Chrome. За винятком того, що Chrome протікає з Рефералом, навіть якщо ви перебуваєте в режимі анонімного перегляду .
— Pacerier

48

Доповнення до корисної відповіді Марка Новаковського - URL зберігається у журналах на сервері (наприклад, у / etc / httpd / logs / ssl_access_log), тому якщо ви не хочете, щоб сервер довше зберігав інформацію термін, не вкладайте його в URL-адресу.


34

Так і ні.

Частина адреси сервера НЕ шифрується, оскільки використовується для налаштування з'єднання.

Це може змінитися в майбутньому із зашифрованими SNI та DNS, але станом на 2018 рік обидві технології часто не використовуються.

Шлях, рядок запиту тощо шифруються.

Примітка для GET-запитів користувач все одно зможе вирізати та вставити URL-адресу з панелі розташування, і ви, ймовірно, не захочете туди вносити конфіденційну інформацію, яку може побачити кожен, хто дивиться на екран.


8
Хочеться поставити +1 цьому, але я вважаю, що "так і ні" вводить в оману - вам слід змінити це, щоб просто вказати, що ім'я сервера буде вирішено за допомогою DNS без шифрування.
— Лоуренс Дол

7
На моє розуміння, ОП використовує слово URL у правильному значенні. Я думаю, що ця відповідь є більш оманливою, оскільки вона чітко не відрізняє ім'я хоста в URL-адресі та ім'я хоста в роздільній здатності DNS.
— Гійом

4
URL-адреса зашифрована. Кожен аспект транзакції HTTP шифрується. Не просто «все інше». Період. -1.
— користувач207421

4
@EJP але DNS пошук робить використовувати то , що в одній точці частини URL, так нетехнічних людини, весь URL не шифрується. Нетехнічна особа, яка просто використовує Google.com для пошуку нетехнічних речей, не знає, де дані в кінцевому підсумку знаходяться або як вони обробляються. Домен, який є частиною URL-адреси, яку відвідує користувач, не на 100% зашифрований, оскільки я як зловмисник може нюхати, який сайт він відвідує. Тільки / шлях URL-адреси притаманний мирянам (не важливо, як).
— trusktr

6
@EJP, @ trusktr, @ Lawrence, @ Guillaume. Ви всі помиляєтесь. Це не має нічого спільного з DNS. SNI " надсилає ім'я віртуального домену як частину узгодження TLS ", тож навіть якщо ви не використовуєте DNS або якщо ваш DNS зашифрований, sniffer все ще може побачити ім'я хосту ваших запитів.
— Pacerier

9

Сторона, яка відстежує трафік, також може визначити відвідувану сторінку, вивчивши ваш трафік і порівнявши його з трафіком, який має інший користувач під час відвідування сайту. Наприклад, якщо на сайті було лише 2 сторінки, одна значно більша за іншу, то порівняння розміру передачі даних дозволить визначити, яку сторінку ви відвідали. Існують способи, як це можна приховати від сторонніх, але вони не є нормальною поведінкою сервера чи браузера. Дивіться, наприклад, цей документ від SciRate, https://scirate.com/arxiv/1403.0297 .

В основному інші відповіді правильні, хоча ця стаття показує, що відвідувані сторінки (тобто URL) можна визначити досить ефективно.


Це дійсно можливо лише на дуже маленьких сайтах, і в цих випадках тема / тон / характер сайту, ймовірно, все ще будуть приблизно однаковими на кожній сторінці.
— Камерон

5
З цитування, яке я дав: "Ми представляємо атаку аналізу трафіку на понад 6000 веб-сторінок, що охоплюють розгортання HTTPS 10 широко використовуваних, провідних в галузі веб-сайтів у таких сферах, як охорона здоров'я, фінанси, юридичні послуги та потокове відео. Наша атака визначає окремі сторінки в той же веб-сайт з 89% точністю [...] ". Здається, ваш висновок щодо доцільності є неправильним.
— pbhj

2
Для всіх, хто цікавиться читати більше про подібний тип вразливості, такі типи атак зазвичай називають атаками бічних каналів .
— Ден Бешард

7

Ви не завжди можете розраховувати на конфіденційність повної URL-адреси. Наприклад, як це буває в корпоративних мережах, пристрої, що постачаються на зразок ПК вашої компанії, налаштовані додатковим кореневим сертифікатом, щоб ваш веб-переглядач міг сподіватися проксі-сервера (перевірити посередницький рівень) трафіку https. . Це означає, що повна URL-адреса піддається огляду. Зазвичай це зберігається в журналі.

Крім того, ваші паролі також піддаються впливу та, ймовірно, реєструються, і це ще одна причина використовувати одноразові паролі або часто змінювати ваші паролі.

Нарешті, вміст запиту та відповіді також відкривається, якщо не зашифровано іншим чином.

Один приклад налаштування інспекції описаний Checkpoint тут . Старий стиль "Інтернет-кафе", використовуючи комп'ютери, що постачаються в комплекті, також може бути створений таким чином.


6

Посилання на мою відповідь на повторне запитання . URL-адреса доступна не лише в історії веб-переглядачів, а на сервері записує журнали, але також надсилається як заголовок HTTP Referer, який, якщо ви використовуєте сторонній вміст, відкриває URL-адресу джерелам, які не є вашими.


Забезпечуючи дзвінки третьої сторони також HTTPS, хоча це не проблема?
— Ліам

3
Це було б зашифровано сертифікатом третіх сторін, щоб вони могли бачити URL
— JoshBerke

5

Зараз 2019 рік і TLS v1.3 був випущений. На думку Cloudflare, SNI може бути зашифрований завдяки TLS v1.3. Отже, я сказав собі чудово! давайте подивимося, як це виглядає в пакетах TCP cloudflare.com Отже, я зловив пакет рукостискань "привіт з клієнтом" у відповідь сервера хмарних хвиль, використовуючи Google Chrome як браузер і wireshark як сніффер пакетів. Я все ще можу прочитати ім'я сервера простим текстом у привітному пакеті Клієнта.

введіть тут опис зображення

Тож остерігайтеся того, що ви можете прочитати, оскільки це все ще не анонімний зв’язок. Проміжне програмне забезпечення між клієнтом і сервером може реєструвати кожен домен, який вимагає клієнт.

Отже, схоже, що для шифрування SNI потрібні додаткові реалізації, щоб працювати разом з TLSv1.3

Наступна стаття описує шифрування SNI, надане Cloudflare як частину TLSv1.3. Однак усі URL-адреси HTTP з cloudflare.com містяться у простому тексті в пакеті TCP під TLS v1.3

[ https://blog.cloudflare.com/encrypted-sni/ вызвали3]


"SNI може бути зашифрований" - ось ключовий момент. Перевірка cloudflare.com/ssl/encrypted-sni з поточним Google Chrome говорить: "Ваш веб-переглядач не шифрував SNI під час відвідування цієї сторінки". На танго потрібно два ...
— Пісквор вийшов з будівлі

Мабуть, поточний Firefox може робити ESNI, але він за замовчуванням відключений: вам потрібно ввімкнути network.security.esni.enabled, встановити network.trr.modeзначення 2 (що в даний час встановлює ваш дозвіл для DoH на CloudFlare) та перезапустити браузер (sic!); тоді він буде використовувати ESNI - там, де підтримується інфраструктура домену. Докладніше див. Blog.mozilla.org/security/2018/10/18/… .
— Пісквор вийшов із будівлі

3

Так і ні.

Фактична URL-адреса зашифрована, це означає, що хтось не міг сказати точну веб-сторінку на веб-сайті, який ви відвідали. Однак заголовок TLS включає ім'я хоста сервера, до якого ви звертаєтесь (наприклад, www.quora.com) незашифрованим. DNS також майже ніколи не шифрується, а також просочує ім'я хоста, до якого ви отримуєте доступ. Цей запит DNS майже завжди проти серверів вашого провайдера за замовчуванням, тому вони можуть легко бачити ім'я хосту кожного веб-сайту, до якого ви звертаєтесь, або нюхаючи ваші запити DNS на інші сервери DNS, або записуючи ваші проти власних.

Однак, якщо вас турбує, чи може хтось дізнатися, на якому веб-сайті ви отримували доступ, цього недостатньо. HTTPS працює на OSI Layer 4 і шифрує всі дані на цьому рівні, але нижчі рівні залишаються в мережах, які їх переносять. Хтось все ще може просто простежити шлях та місце призначення трафіку на рівні OSI 3. Це означає, що хтось нюхаючи ваш трафік, може знайти IP-адресу та розширити доменне ім’я веб-сайту, на якому ви отримували доступ.

Гірше, що в перший раз (і в наступні рази, залежно від того, як / коли буде очищено кеш-пам'ять DNS), ви, ймовірно, надішлете незашифрований DNS-запит на будь-який ваш DNS-сервер, щоб запитати IP-адресу вашої цільової URL-адреси HTTPS (знову ж таки, автор за замовчуванням зазвичай сервери вашого провайдера) Кожен, хто має доступ до вашого трафіку по шляху до вашого DNS-сервера, може мати можливість нюхати цей запит.

Якщо ви шукаєте високий рівень конфіденційності, вам потрібно буде доповнити HTTPS довіреною зашифрованою VPN та / або зашифрованою проксі-службою. Ви також можете заглянути в DNSSEC, щоб захистити свої запити DNS. Цей сервіс повинен бути надійним, оскільки вони можуть легко виконати вищенаведене відстеження джерел та напрямків вашого трафіку.


2

Напевно, тут є кілька хороших відповідей, більшість з яких зосереджується на навігації в браузері. Я пишу це у 2018 році, і, напевно, хтось хоче знати про безпеку мобільних додатків.

Якщо ви керуєте обома кінцями програми (сервер та додаток) для мобільних додатків , якщо ви використовуєте HTTPS, ви захищені . iOS або Android перевірять сертифікат і пом'якшують можливі атаки на MiM (це буде єдиною слабкою стороною у всьому цьому). Ви можете надсилати конфіденційні дані через HTTPS-з'єднання, які будуть зашифровані під час транспортування . Просто ваш додаток і сервер будуть знати будь-які параметри, надіслані через https.

Єдиним "можливо" тут було б, якщо клієнт або сервер заражені шкідливим програмним забезпеченням, яке може бачити дані, перш ніж вони будуть завернуті в https. Але якщо хтось заражений таким програмним забезпеченням, він матиме доступ до даних, незалежно від того, що ви використовуєте для його транспортування.


1

Крім того, якщо ви створюєте API ReSTful, проблеми з витоком веб-переглядача та http-реферером в основному пом'якшуються, оскільки клієнт може не бути веб-переглядачем, і у вас може не бути людей, що натискають посилання.

У такому випадку я рекомендую увійти в oAuth2, щоб отримати маркер носія. У такому випадку єдиними конфіденційними даними будуть початкові облікові дані ..., які, ймовірно, повинні бути у запиті після публікації


0

Хоча у вас вже є дуже хороші відповіді, мені дуже подобається пояснення на цьому веб-сайті: https://https.cio.gov/faq/#what-information-does-https-protect

коротше: використання HTTPS шкур:

  • HTTP-метод
  • запити парами
  • Тіло POST (якщо воно є)
  • Запросити заголовки (файли cookie)
  • Код статусу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.