Вы скопировали пароль, переключились на сайт и увидели запрос на чтение буфера обмена. Что именно получит страница, если нажать «Разрешить»? А если никакого запроса нет, значит ли это, что она ничего не может прочитать?
Путей доступа два. Когда вы вставляете что-то на страницу, она получает данные этой вставки. Отдельный API браузера позволяет прочитать буфер без вставки, если это допускают правила доступа в браузере. Из-за путаницы между этими способами возникают два неверных ответа: успокаивающий «сайты не могут читать буфер обмена» и пугающий «каждая открытая вкладка видит ваши пароли».
Вставка — это уже передача данных
Нажмите Ctrl+V или Command+V в текстовом поле, и браузер вызовет событие paste. Обработчик может вызвать event.clipboardData.getData('text/plain') ещё до того, как текст появится в поле. Для вставки, которую начал сам пользователь, отдельный диалог разрешения на доступ к буферу не нужен. Вы только что указали браузеру, куда поместить данные.
Попробуйте сами. Выделите и скопируйте образец, а затем вставьте его в пустое поле. Виджет посчитает длину текста и перечислит форматы, доступные через событие. Сам текст он отбросит, не вставляя в поле. Этот компонент ничего из обеих проверок не отправляет на сервер и не сохраняет.
Используйте этот безобидный образец. Выделите и скопируйте его сами, затем попробуйте оба способа ниже. Копирование заменит текущее содержимое буфера обмена.
bscan clipboard sample 123 Вы вставляете данные на страницу
Страница запрашивает чтение
Эта кнопка запрашивает текущий текст из буфера обмена. Перед нажатием скопируйте только образец. Браузер может запросить разрешение или показать меню «Вставить».
Ячейка таблицы или форматированный абзац могут передать больше, чем обычный текст. В буфере обмена могут находиться несколько представлений одного элемента, например 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, помогает организовать эту работу. Но каждую вставку по-прежнему стоит считать осознанной передачей данных принимающей странице. Разделение профилей — не повод вставлять секрет клиента не в тот аккаунт.
Скопируйте образец, сравните результаты двух проверок, а затем пересмотрите разрешения, выданные во время теста. После этого запустите полное сканирование: оно покажет сигналы браузера, для сбора которых вставка не нужна.