Чи зашифровані 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.