Буфер обмена — это буфер, который некоторые операционные системы предоставляют для краткосрочного хранения и передачи внутри и между прикладными программами. Буфер обмена обычно является временным и безымянным, а его содержимое находится в оперативной памяти компьютера . [1]
Буфер обмена предоставляет интерфейс прикладного программирования, с помощью которого программы могут определять операции вырезания, копирования и вставки . Программе остается определять методы, с помощью которых пользователь может управлять этими операциями, которые могут включать сочетания клавиш и выбор меню . Когда элемент копируется или вырезается, буфер обмена должен хранить достаточно информации, чтобы обеспечить разумный результат независимо от того, куда вставляется элемент. Прикладные программы могут расширять функции буфера обмена, предоставляемые операционной системой. Менеджер буфера обмена может предоставить пользователю дополнительный контроль над буфером обмена. Конкретная семантика буфера обмена различается в разных операционных системах, может также различаться между версиями одной и той же системы и иногда может изменяться программами и предпочтениями пользователя.
Windows , Linux и macOS поддерживают одну транзакцию буфера обмена. [2] [3]
Буферы обмена как буферы для небольших текстовых фрагментов впервые были использованы Пентти Канерва , когда он использовал их для хранения удаленных текстов с целью их восстановления. [4] Поскольку можно было удалить текст в одном месте и восстановить его в другом, термин «удаление» не был тем, что можно было бы ожидать в этом случае. Ларри Теслер переименовал это в 1973 году в « вырезать, копировать и вставить» и придумал термин «буфер обмена» для этого буфера, поскольку этим методам нужен буфер обмена для временного сохранения скопированных или вырезанных данных. [5]
Приложения взаимодействуют через буфер обмена, предоставляя либо сериализованные представления объекта, либо обещание (для более крупных объектов). [6] В некоторых обстоятельствах передача определенных общих форматов данных может быть достигнута непрозрачно с помощью использования абстрактной фабрики ; например, Mac OS X использует класс NSImage для предоставления доступа к данным изображения, хранящимся в буфере обмена, хотя фактический формат данных изображения, поддерживающих объект, скрыт. Отправляющее и принимающее приложения согласовывают форматы, которые могут быть переданы между ними, часто с активным виджетом GUI, ответственным за предоставление приемлемых преобразований типов. Буфер обмена позволяет передавать общие элементы, такие как URL-адреса, цвета, изображения, строки, атрибутированные строки ( Rich text ) и звуки. Операционная система и набор инструментов GUI могут предоставлять некоторые общие преобразования, например, преобразование из Rich Text в обычный текст и наоборот. Различные идентификаторы типов для передачи данных поддерживаются современными операционными системами, которые могут автоматически предоставлять приемлемые сопоставления между системами типов, такими как между MIME и Uniform Type Identifier . [7] [8]
Перехват буфера обмена или инъекция буфера обмена — это эксплойт , при котором содержимое буфера обмена человека заменяется вредоносными данными, такими как ссылка на вредоносный веб-сайт. [9] Например, если пользователь копирует адрес получения криптовалюты в буфер обмена, программа-перехватчик может перезаписать его адресом, контролируемым перехватчиком, так что когда пользователь вставляет адрес, его криптовалюта передается перехватчику вместо предполагаемого получателя. [10] Хотя некоторые уязвимости безопасности были исправлены, JavaScript все еще можно использовать для изменения содержимого буфера обмена с помощью атаки, получившей название «pastejacking». [11] [12] Дилан Эйри, который разработал атаку, создал веб-сайт, демонстрирующий, как этот эксплойт может быть использован для обмана пользователя, заставляя его выполнять команды, которые он не хотел выполнять. [13]
Были эксплойты, когда веб-страницы захватывали данные буфера обмена. В начале 2013 года исследователи выявили риски, исходящие от менеджеров паролей на базе Android , и задокументировали, как пароли в 21 из самых популярных из этих приложений могли быть доступны любому другому приложению на устройстве Android, включая те, которые имеют крайне низкий уровень привилегий. [14] Джо Сигрист отмечает, что это « проблема уровня ОС , которая влияет на все, что работает на Android». [15] [1]
Расширения менеджера буфера обмена добавляют функциональность к интегрированным функциям буфера обмена операционной системы. Это приложения, которые позволяют пользователю управлять буфером обмена. На таких платформах, как Linux, которые используют несколько несовместимых наборов инструментов GUI, менеджеры буфера обмена часто используются для передачи данных между приложениями, использующими различные такие фреймворки.
Когда менеджер буфера обмена предоставляет несколько транзакций вырезания и вставки, буфер обмена рассматривается как стопка или альбом вырезок, а новые вырезки и копии помещаются в список последних транзакций. Стандартная операция вставки копирует самую последнюю транзакцию, в то время как специализированные вставки предоставляют доступ к другим сохраненным транзакциям. Эти менеджеры обычно также предоставляют окно, которое отображает историю транзакций и позволяет пользователю выбирать более ранние копии, редактировать их, изменять их формат и даже выполнять поиск среди них.
Поскольку большинство операционных систем (например, Windows, macOS, Linux, X11, Android, iOS) не сохраняют содержимое буфера обмена в каком-либо постоянном хранилище — когда пользователь выходит из системы или перезагружает ее, содержимое буфера обмена удаляется — добавлена функциональность для постоянного сохранения буфера обмена. Другой пример — заставить локальный буфер обмена работать с онлайн-приложениями, сохраняя данные буфера обмена в онлайн-расположении при событии копирования или вырезания, делая эти данные доступными для вставки онлайн-приложениям. Менеджеры буфера обмена также могут служить инструментами для преодоления ограничений программного обеспечения, не поддерживающего копирование и вставку (например, при входе на удаленный сервер Windows нельзя скопировать и вставить свое имя пользователя и пароль).
Операционная система Amiga использует 256 блоков, поэтому одновременно можно использовать несколько буферов обмена. [16]
Android предоставляет буфер обмена, который может содержать до одного объекта клипа и доступен по всей системе. Простой текст хранится непосредственно в буфере обмена; сложные данные хранятся по ссылке. Объект клипа имеет один из трех форматов: текстовая строка, объект URI или намерение. [17]
Для взаимодействия с буфером обмена приложение использует класс ClipboardManager [18] и системные вызовы для вырезания, копирования и вставки объектов.
В Android 8.0 буфер обмена впервые появляется в пользовательском интерфейсе: в ситуации, когда пользователь готовится вставить из буфера обмена, появляется опция «Буфер обмена», которая дает пользователю доступ ко многим объектам, скопированным или вырезанным в буфер обмена в прошлом. Кроме этого, и в более ранних версиях, у пользователя нет доступа к буферу обмена, за исключением приложений, которые делают его доступным для пользователя.
Буфер обмена называется «pasteboard» в iOS, аналогично OS X. Приложения в этой операционной системе могут создавать дополнительные буферы обмена, называемые экземплярами класса UIPasteboard, которые могут быть публичными или частными. Один экземпляр может содержать один элемент или несколько элементов в разных форматах. [19]
Форматы идентифицируются с помощью унифицированных идентификаторов типов (UTI). [20]
Доступ к данным, содержащимся в буфере обмена, возможен только через графический интерфейс пользователя, а не из системы и приложений.
Буфер обмена в macOS хранит один элемент в нескольких доступных форматах.
Содержимое буфера обмена можно просмотреть, выбрав пункт меню Показать буфер обмена в меню Правка Finder. Необработанные данные и сохраненные форматы можно просмотреть с помощью ClipboardViewer. [21]
Доступ к буферу обмена из командной строки можно получить с помощью следующих команд: [22] [23]
$ # для копирования данных в буфер обмена: $ echo 'hello world' | pbcopy $ # для вставки из буфера обмена: $ pbpaste hello world
Буфер обмена в Microsoft Windows и ReactOS хранит один элемент в нескольких доступных форматах.
Каждый элемент имеет по крайней мере один формат буфера обмена, но может иметь различные типы формата тех же данных. Три различных типа возможных форматов: [24]
Вплоть до Windows XP доступ к буферу обмена можно было получить через приложение ClipBook Viewer . [27] В более новых версиях Windows доступ к содержимому можно получить через менеджеры буфера обмена .
Данные можно сохранить в буфере обмена Windows [28] и ReactOS [29] через командную строку с помощью команды clip : [30]
$ # для вставки содержимого папки в буфер обмена: $ dir | clip
Доступ к буферу обмена также можно получить через PowerShell : [31] [32]
# для вставки содержимого каталога в буфер обмена Set-Clipboard -Path "C:\directory\" # для получения содержимого буфера обмена Get-Clipboard
В Windows 10 и Windows 11 есть приложение Clipboard, позволяющее хранить несколько текстовых элементов буфера обмена. Доступ к нему можно получить, нажав Windows+V.
Система X Window, обычно используемая в системах Unix и Linux, предоставляет три буфера обмена, которые называются «CLIPBOARD», «PRIMARY» и «SECONDARY». [33] Использование и обработка различных вариантов выбора не стандартизированы. Однако большинство современных наборов инструментов и сред рабочего стола, таких как GNOME или KDE , следуют общепринятому соглашению, изложенному в спецификации freedesktop.org . [34] Один вариант, CLIPBOARD, используется для традиционной семантики буфера обмена с сочетаниями клавиш, идентичными Windows. Другой вариант, PRIMARY, является механизмом, специфичным для X11. Данные «копируются» сразу после выделения и вставляются третьей (средней) кнопкой мыши. [35] Эти скопированные данные обычно отделяются от выбора CLIPBOARD и не изменяют его содержимое. [36] SECONDARY планировался как альтернатива PRIMARY, но используется непоследовательно. [33]
Существует два инструмента командной строки (xsel и xclip), которые могут получить доступ к буферу обмена: [37]
$ # для вставки стандартного вывода в буфер обмена с помощью xclip
$ echo text | xclip -in -selection clipboard $ # для вставки стандартного вывода в буфер обмена с помощью xsel
$ echo text | xsel --clipboard
Главное отличие OS X от Windows заключается в том, что в буфере обмена CLIPBOARD фактически не хранятся никакие данные, а только ссылка на скопированные или вырезанные данные. Приложение заявляет о праве собственности на выбор CLIPBOARD и сообщает о своем праве собственности X Server. [35] При вставке этих данных данные и их доступные форматы запрашиваются у приложения, которому принадлежит выбор CLIPBOARD. [38]
Приложения могут получать доступ к буферу обмена или его данным через API .
В JavaScript существует класс, который обнаруживает изменения в данных буфера обмена пользователя (ClipboardEvent) [39], а также функции для изменения содержимого буфера обмена или чтения из него (clipboardData.getData(), clipboardData.setData()) [40] , но они поддерживаются не всеми браузерами, поскольку изменение буфера обмена пользователя может представлять угрозу безопасности.
В Qt существует оболочка для каждой поддерживаемой платформы [41] . Она обеспечивает доступ к буферам обмена оконной системы с использованием класса QClipboard. Этот класс облегчает доступ к общим типам данных с помощью функций. [42] Тип данных элемента, хранящегося в буфере обмена, указывается через MIME, и данные MIME также могут быть помещены в буфер обмена с помощью функций из этого класса.