Почему фрагмент # в URL не попадает в логи сервера
Когда браузер отправляет HTTP-запрос, текст после # остаётся локально. Burn-Link дописывает ключ расшифровки в s.html?id={id}#{key} после #: сервер получает только номер шифротекста, ключ не видит. Страница чтения открыта получателю, регистрироваться не нужно. Ниже разберём эту границу и шаги, которые можно проверить сразу.
Сначала решите, какой слой проверяете
Статья отвечает только на вопрос, почему # не попадает в логи сервера. Это не инструкция по Burn-Link и не обзор на странице О безопасности о том, покидает ли открытый текст браузер.
Что стоит после #
Секрет в адресной строке не значит, что в логах сервера лежит копия. Для параметров запроса это в целом верно, для фрагмента — нет.
Когда эксплуатация вставляет временный пароль в чат, а поддержка пересылает адрес админки вместе с token, обычно страшно не то, что «получатель увидит», а то, что на каждом прыжке может остаться полная копия ссылки. Отсюда частая догадка: раз секрет виден в адресной строке, в логах сервера обязательно есть копия.
Полный адрес делится на три части. Протокол и хост решают, к кому подключается браузер; путь и параметры запроса после вопросительного знака решают, какой ресурс нужен, — и эти две части попадают в строку HTTP-запроса. Символы после решётки называются fragment, по-русски обычно «фрагмент». Изначально они говорили браузеру прокрутить страницу к якорю; позже фронтенд-скрипты читают этот текст локально через location.hash. Сервер его не получает и не должен использовать для маршрутизации или авторизации.
Положить ключ после # — не значит изобрести новый алгоритм шифрования. Это использование давней границы отправки в браузерах: одна ссылка может нести и «номер для сервера», и «ключ только для текущей вкладки». Именно этой границей пользуется одноразовая ссылка UsePwd. Страницы создания и чтения работают сразу, регистрироваться не нужно ни одной стороне; сервер лишь временно хранит шифротекст, открытый текст и ключ по умолчанию в теле запроса не уходят.
Какая часть реально уходит
Смотрите s.html?id=abc123#the-key. В GET браузера в строке запроса обычно только путь и id. #the-key в запросе нет, и логу нечего записать.
Так устроен стандарт URL уже давно: это не частная договорённость одного сайта и не «сервер пообещал не смотреть». «Видит ли сервер» здесь значит: после терминации TLS может ли исходный сервер или обратный прокси под вашим контролем прочитать это поле из HTTP-запроса. Речь не про скомпрометированное устройство, расширение, которое читает страницу, или сохранённый скриншот.
?id=abc123&key=secret
Вся строка попадает в строку запроса. Типичные журналы доступа обычно сохраняют полный URL.
#secret
Браузер не считает его частью запроса. Типичным журналам доступа нечего записать.
ciphertext
То, что реально отправляется при создании Burn-Link. У UsePwd это только шифротекст, число часов действия и число прочтений.
Частая ошибка: «раз есть HTTPS, логи ничего не увидят». Шифрование канала не даёт посреднику прочитать открытый текст в пути. После терминации TLS исходный сервер и обратный прокси под вашим контролем по-прежнему видят полную строку запроса. Поэтому HTTPS не стирает ?key= из журналов доступа. Фрагмент не попадает в логи потому, что его вообще не отправляли, а не потому, что канал зашифрован.
Ещё один легко пропущенный канал — Referer. По умолчанию часть переходов передаёт URL предыдущей страницы следующей площадке. Современные браузеры при переходе с HTTPS на HTTPS обычно отрезают фрагмент; параметры запроса в Referer всё ещё могут остаться. Поэтому одноразовый ключ лучше ставить после #, а не в ?key=: вы не можете потребовать от каждого следующего сайта не записывать адрес источника.
То, что фрагмент не входит в HTTP, не значит «ссылку нельзя скопировать». Полная строка в адресной строке, включая ключ после #, по-прежнему появляется в локальной истории, в превью при пересылке и в сообщениях, которые вы сами отправляете. Статья разбирает только слой логов сервера и не делает из фрагмента универсальный сейф.
Откройте панель Network — и увидите
Цель не доказать, что «никто в мире этого не увидит», а показать: в этом HTTP-запросе к UsePwd нет ключа после #.
-
01
Откройте страницу создания Burn-Link
Перейдите в Burn-Link. Страница открылась — можно пользоваться, вход не нужен. Введите образец текста, который вы узнаете, и не используйте настоящий рабочий ключ.
-
02
Откройте панель Network и очистите записи
Нажмите F12 или правой кнопкой «Просмотреть код», затем панель Network. При необходимости очистите уже собранные запросы, чтобы не смешать их с первой загрузкой страницы.
-
03
Создайте ссылку
После отправки браузер сначала шифрует текст в текущей вкладке алгоритмом AES-256-GCM, затем отправляет запрос на
/api/secrets. Поля:ciphertext,ttl_hours,max_reads. Адрес для передачи выглядит какs.html?id={id}#{key}. -
04
Проверьте запрос создания
Откройте этот POST. В URL запроса не должно быть ключа после
#; в теле — шифротекст и два числа, а не образец текста, который вы только что ввели. -
05
Откройте страницу чтения и сверьте GET
Откройте ту же ссылку на странице чтения. В последующих GET или запросах статуса в пути только
id. Положите рядом строку после#в адресной строке и URL запроса в панели Network: первая остаётся локально, во второй этого куска нет.
В рабочей среде могут быть ещё запросы аналитики на /tj/. В полезной нагрузке — имя страницы и кнопки, например «Создать ссылку», не открытый текст, не ключ и не содержимое файла. Локальный просмотр аналитику не отправляет. Если вам важно только, попал ли ключ в HTTP, отфильтруйте /api/secrets и не принимайте аналитику за канал шифротекста.
Эти шаги дополняют вопрос «покидает ли открытый текст браузер» на странице О безопасности: там — границы локального расчёта; здесь URL разбирается по частям, чтобы объяснить, почему в логах нет куска после #. Ни одна из страниц не заменяет форму на странице создания.
Как Burn-Link использует эту границу
Номер идёт в параметрах запроса, ключ — во фрагменте. Сервер знает, что есть шифротекст, сколько раз его можно прочитать и когда он истечёт. Чем открыть — не знает.
При создании текущая вкладка через Web Crypto генерирует случайный ключ, шифрует текст алгоритмом AES-256-GCM и отдаёт шифротекст серверу. Полученный номер попадает в ?id=; ключ дописывается только после #.
Страница чтения открыта получателю. Когда он открывает s.html?id={id}#{key}, браузер сначала запрашивает шифротекст или статус по id, затем расшифровывает ключом из фрагмента, который остаётся на устройстве. После числа прочтений, заданного при создании, сервер удаляет шифротекст, и ссылку больше не прочитать. Получателю тоже не нужна регистрация. Сама страница чтения — временный просмотр шифротекста, не вход в индекс сайта; чтобы понять возможности продукта, вернитесь на страницу создания или к шагам проверки в этой статье.
Ключ во фрагменте закрывает слой «логи сервера и строка запроса». Он не закрывает вопрос «кому вы отправили полную ссылку». Чаты, почта и системы заявок сохраняют весь адрес, который вы вставили. У кого полная ссылка — у того и номер, и ключ. Burn-Link ограничивает срок жизни шифротекста и число прочтений на стороне сервера, а не то, сделает ли получатель скриншот или перешлёт дальше.
Чем это отличается от схемы с параметрами запроса
Некоторые одноразовые ссылки кладут материал для расшифровки в ?k=. Так проще, но при каждом открытии ключ попадает в строку запроса, и CDN, WAF и журналы доступа исходного сервера могут сохранить копию. Фрагмент стоит одной решётки, а взамен даже полная запись URL на стороне хостинга не содержит половины, которой открывается шифротекст. Цена в том, что получателя нужно попросить скопировать ссылку целиком, а не только часть до решётки: без # и того, что за ним, страница чтения получит шифротекст и не сможет открыть его локально.
Поэтому статья не называет Burn-Link «менеджером паролей» или «сейфом, из которого можно всё вернуть». У UsePwd нет аккаунтов, нет хранилища паролей и нельзя вернуть пароль по пользователю. Ссылка потеряна, фрагмент обрезан или число прочтений исчерпано — сервер не восстановит открытый текст за вас. Кто мы такие — на странице О сервисе.
Не читайте ключ во фрагменте как «расшифровать может только доверенный сервер». Всё наоборот: у сервера этого ключа нет, и расшифровать за вас он не может. Расшифровать может любая вкладка браузера, которая открыла полную ссылку. Граница доверия — «у кого вся строка адреса», а не «какой сервер надёжнее».
Чего фрагмент не закрывает
Прочитать «не в логах сервера» как «абсолютно безопасно» — значит пропустить несколько границ, которые тоже можно проверить. Сначала перечислим их, чтобы статью о механике не приняли за гарантийный талон.
#, но в сообщении живому человеку полный ключ всё равно есть.
Burn-Link подходит для одноразовой передачи, которой вы доверяете канал и которая должна закончиться после прочтения: временный пароль, одноразовый API Key, короткоживущий код. Это не долгосрочный сейф и не замена личной передачи ценного мастер-ключа.
Резервная копия файла — другой путь. Локальное шифрование одного файла до 5 ГБ — на странице Шифрование файлов: AES-256-GCM в текущей вкладке, на выходе .lock / .enc, файл по умолчанию на сервер не уходит. Это «оставить себе файл с шифротекстом», а не «затолкать ключ в URL». Два инструмента нельзя смешивать в одну и ту же гарантию.
Как выбрать канал передачи
Вам нужно передать короткий секрет другому человеку и не хотите, чтобы журналы доступа на стороне хостинга сохранили материал, которым его можно открыть. Решайте в таком порядке, а не по тому, чей слоган звучит громче.
Если секрет нужно прочитать ограниченное число раз и обе стороны могут открыть браузер, используйте одноразовую ссылку: открытый текст шифруется локально, номер идёт в ?id=, ключ — после #, регистрация не нужна. После создания один раз сверьте в панели Network: тело POST — шифротекст, в URL GET нет фрагмента. Если на самом деле нужны долгое хранение, синхронизация устройств или восстановление, это уже за пределами сайта: возьмите отдельный менеджер паролей и не считайте UsePwd системой аккаунтов.
Если секрет вообще не должен попадать на чужие страницы, ссылку не создавайте: скажите лично, передайте на офлайн-носителе или только в уже существующем канале со сквозным шифрованием. Схема с фрагментом уменьшает «ключи в логах сервера», а не «всех, кто видит экран». Пока эти слои разделены, статью про механику URL не прочитают как гарантию продукта.
Насколько стоек сам пароль — отдельный вопрос. Случайную строку длиной 6–128 символов даёт генератор паролей; чтобы локально оценить стойкость и сверить с открытым списком слабых паролей из утечек, который прилагается к странице, откройте проверку пароля. Это не поиск по всей сети, проверяемая строка на сервер не уходит. Перед отправкой ссылки или текста заявки уберите параметры отслеживания или замаскируйте данные на странице убрать UTM. Эти страницы, как и эта статья, работают без регистрации. Справа в шапке только переключатель языка.
Прочитали — проверьте сразу
Статья отвечает, почему в логах нет куска после #. Чтобы создать одноразовую зашифрованную ссылку, откройте Burn-Link — регистрироваться не нужно.