вернуться к обзору Больше статей

Могут ли сайты читать буфер обмена? Проверьте два способа

Вы скопировали пароль, переключились на сайт и увидели запрос на чтение буфера обмена. Что именно получит страница, если нажать «Разрешить»? А если никакого запроса нет, значит ли это, что она ничего не может прочитать?

Путей доступа два. Когда вы вставляете что-то на страницу, она получает данные этой вставки. Отдельный API браузера позволяет прочитать буфер без вставки, если это допускают правила доступа в браузере. Из-за путаницы между этими способами возникают два неверных ответа: успокаивающий «сайты не могут читать буфер обмена» и пугающий «каждая открытая вкладка видит ваши пароли».

Если коротко: да, сайт может прочитать то, что вы в него вставили. Он также может запросить прямое чтение буфера обмена. Chrome умеет запоминать выданное разрешение, а Firefox и Safari иначе учитывают действия пользователя и показывают запрос на вставку. Простое открытие нового сайта не раскрывает ему содержимое буфера автоматически. Виджет ниже проверяет оба пути по отдельности на безобидном тексте.

Вставка — это уже передача данных

Нажмите Ctrl+V или Command+V в текстовом поле, и браузер вызовет событие paste. Обработчик может вызвать event.clipboardData.getData('text/plain') ещё до того, как текст появится в поле. Для вставки, которую начал сам пользователь, отдельный диалог разрешения на доступ к буферу не нужен. Вы только что указали браузеру, куда поместить данные.

Событие всплывает по дереву документа, поэтому обработчик необязательно привязывать к конкретному полю. Страница также может отменить стандартную вставку. Если после вставки поле осталось пустым, это ещё не значит, что страница ничего не получила.

Попробуйте сами. Выделите и скопируйте образец, а затем вставьте его в пустое поле. Виджет посчитает длину текста и перечислит форматы, доступные через событие. Сам текст он отбросит, не вставляя в поле. Этот компонент ничего из обеих проверок не отправляет на сервер и не сохраняет.

Два пути передачи данных странице

Используйте этот безобидный образец. Выделите и скопируйте его сами, затем попробуйте оба способа ниже. Копирование заменит текущее содержимое буфера обмена.

bscan clipboard sample 123

Вы вставляете данные на страницу

Ждём вашу вставку. Чтение буфера обмена не запрашивалось.

Страница запрашивает чтение

Эта кнопка запрашивает текущий текст из буфера обмена. Перед нажатием скопируйте только образец. Браузер может запросить разрешение или показать меню «Вставить».

Проверяем доступность API…
Вставка и прямое чтение используют разные пути доступа. Виджет держит в памяти страницы только счётчики и названия форматов, ничего не отправляя на сервер и не сохраняя. Очистка результатов не очищает буфер обмена и не сбрасывает разрешения браузера.

Ячейка таблицы или форматированный абзац могут передать больше, чем обычный текст. В буфере обмена могут находиться несколько представлений одного элемента, например text/plain и text/html. Страница может получить форматы, которые браузер предоставил для этой вставки, а не только символы, которые вы ожидали увидеть. Наш виджет перечисляет названия форматов; вставленный HTML он не отображает, а вставленные файлы не открывает.

Может ли сайт прочитать буфер обмена без вставки?

Да, если браузер разрешит прямое чтение. Метод navigator.clipboard.readText() запрашивает текст из текущего буфера обмена. Через read() можно также запросить поддерживаемые нетекстовые форматы. Оба метода относятся к Async Clipboard API, доступному только в безопасных контекстах, например по HTTPS. Защищённое соединение — необходимое условие, а не безусловное разрешение собирать ваши данные.

Нажимайте кнопку чтения в виджете только после того, как скопируете безобидный образец. Это настоящий запрос к API, поэтому браузер может показать собственный диалог разрешения или меню вставки. Страница сообщит, удался ли запрос и какой длины текст вернулся. Отказ не превратится в зелёный значок «безопасный браузер»: он характеризует лишь этот запрос, при текущем фокусе и действующих разрешениях.

Спецификация Clipboard различает настоящую вставку пользователем и событие с именем `paste`, которое отправил скрипт. Скрипт не может подделать доверенное событие вставки и тем самым открыть доступ к системному буферу обмена. Поэтому первая проверка требует вашей вставки, а вторая — чтения, одобренного браузером.

Chrome запоминает разрешение; Safari и Firefox работают иначе

В браузерах на Chromium, включая Chrome и Edge, документ в фокусе может запросить разрешение clipboard-read. Если оно уже выдано, чтение при соблюдении остальных условий может пройти без нового запроса. «В этот раз меня не спросили» не означает, что разрешение никогда не выдавалось. Проверьте действующие разрешения сайта.

Firefox и Safari не поддерживают такое же постоянное разрешение clipboard-read. Для прямого чтения им нужно недавнее действие пользователя; при этом они могут показать временный пункт «Вставить». При чтении содержимого, скопированного из того же источника (origin), запрос может не появиться. Поэтому проверка только на тексте, скопированном с самой тестовой страницы, способна создать неверное впечатление о том, что произойдёт с текстом из другого приложения.

Для повторной проверки наберите безобидное предложение в локальном текстовом редакторе, скопируйте его там, вернитесь сюда и снова запросите чтение. Сравнивайте поведение интерфейса браузера, а не только итоговое число. MDN описывает различия между браузерами, а WebKit объясняет свою модель доступа к буферу обмена. Встроенные фреймы и политики браузера могут накладывать дополнительные ограничения, поэтому проверяйте в том браузере, которым пользуетесь на самом деле.

Читает ли кнопка «Копировать» то, что было в буфере раньше?

Необязательно. Кнопка, использующая navigator.clipboard.writeText(), записывает текст страницы в буфер обмена. Этот метод не возвращает его прежнее содержимое перед записью. Чтение и запись — отдельные операции с разными правилами доступа, как объясняет руководство Google по Async Clipboard.

Страница также может обработать событие copy, выбрать, что попадёт в буфер, и отменить стандартное копирование. API события copy не передаёт обработчику старое содержимое буфера. Но прочитать текст, выделенный в её собственном документе, страница может. Копирование предложения со страницы — видимое ей действие. Это показывает наш отдельный виджет переключения вкладок и активности на странице.

По той же причине кнопка «Копировать» не гарантирует, что скопированный текст совпадает с видимым. Проверяйте вставленные команды перед запуском. Опасность возникает при выполнении полученного текста, а не от самого наличия кнопки «Копировать».

Видят ли сайты историю буфера обмена?

В обычном веб-API Clipboard нет метода, который перечисляет историю буфера обмена операционной системы. Разрешённое чтение касается текущего содержимого буфера, а не архива всего, что вы копировали на прошлой неделе. У менеджеров буфера обмена, расширений браузера и нативных приложений свои модели доступа. По поведению приложения на телефоне нельзя судить о возможностях обычной веб-страницы.

Это ограничение не стирает уже переданные данные. Сайт, получивший текст, может сохранить собственную копию. Замена содержимого буфера, закрытие вкладки или сброс разрешения не отзовут эту копию. Точно так же кнопка «Очистить результаты» выше очищает показания виджета, но не системный буфер обмена и не разрешение браузера.

Закройте тот путь доступа, который открыли

В настольном Chrome откройте настройки, затем «Конфиденциальность и безопасность», «Настройки сайтов» и найдите «Буфер обмена». Просмотрите список разрешённых сайтов и отзовите доступ там, где он больше не нужен. Можно также открыть меню текущего сайта рядом с адресной строкой и проверить его настройки. Эти элементы описаны в руководстве Google по разрешениям. Запрет прямого чтения всё равно не помешает странице получить данные, которые вы сами в неё вставите.

В повседневной работе вставляйте данные только туда, куда намерены их передать. Проверяйте разрешения на безобидных образцах. Если вас интересует, что страница узнаёт без ваших действий, сравните это с фингерпринтингом по шрифтам или чтением строки WebGL-рендерера. Это другие способы сбора сведений, и отказ в чтении буфера ничего о них не говорит.

Если вы ведёте клиентские аккаунты в отдельных профилях, такой инструмент, как Incogniton, помогает организовать эту работу. Но каждую вставку по-прежнему стоит считать осознанной передачей данных принимающей странице. Разделение профилей — не повод вставлять секрет клиента не в тот аккаунт.

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

Логотип Incogniton

Повысьте уровень своей приватности

Стрелка