Найти в Дзене
Блокнот математика

Рубрика "Секреты Вим". Песочница

Привет, коллеги! Поговорим о безопасности. Есть в Вим такая возможность: выполнить код в песочнице. В песочнице нельзя делать небезопасные вещи, в том числе: Можно выполнить любую команду в песочнице, передав ее команде :sandbox Это сравнительно безопасно. Но если команда должна что-то поменять, она не сможет. А вот если не должна менять, но меняет, то песочница защитит. Например, если вы скачали функцию на скриптовом языке Вим из интернет и не уверены, что там в точности то, что вы думаете. Некоторые команды и без вас выполняются в песочнице. Так, если опция statusline содержит выражение, оно будет вычислено там. Аналогично и опции foldexpr, formatexpr, includeexpr, indentexpr. А некоторые другие нельзя задавать из песочницы. Например, пусть некоторые файлы в конце содержат строчки (по одной на файл): vim: statusline=OK vim: statusline=%!toupper('ok') vim: statusline=%!toupper(getline(1))) vim: statusline=%!setline(2,toupper(getline(1))) Это modeline: строка, которая позволяет Виму пр

Привет, коллеги! Поговорим о безопасности.

Песочница. Фото из открытых источников.
Песочница. Фото из открытых источников.

Есть в Вим такая возможность: выполнить код в песочнице. В песочнице нельзя делать небезопасные вещи, в том числе:

  • изменять текст в буфере
  • создавать и изменять привязки, автокоманды, функции, пользовательские команды
  • выставлять некоторые опции (например, backupdir, другие пути, опции, связанные с кодировкой и другие небезопасные опции)
  • изменять предусмотренные переменные (которые v:)
  • выполнять команды оболочки (через !)
  • читать и записывать файлы
  • переходить в другой буфер
  • выполнять код на других языках (такая возможность в Вим может присутствовать)

Можно выполнить любую команду в песочнице, передав ее команде :sandbox

Это сравнительно безопасно. Но если команда должна что-то поменять, она не сможет. А вот если не должна менять, но меняет, то песочница защитит. Например, если вы скачали функцию на скриптовом языке Вим из интернет и не уверены, что там в точности то, что вы думаете.

Некоторые команды и без вас выполняются в песочнице. Так, если опция statusline содержит выражение, оно будет вычислено там.

Аналогично и опции foldexpr, formatexpr, includeexpr, indentexpr. А некоторые другие нельзя задавать из песочницы.

Например, пусть некоторые файлы в конце содержат строчки (по одной на файл):

vim: statusline=OK
vim: statusline=%!toupper('ok')
vim: statusline=%!toupper(getline(1)))
vim: statusline=%!setline(2,toupper(getline(1)))

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

Первая строка выполнится без проблем: в строке статуса появится текст OK.

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

Третья тоже выполнится: мы запустили щупальце в текст, взяли первую строчку функцией getline, но ничего не меняли — это допускается. В строке статуса появится первая строка текста в верхнем регистре. Ну вот допустим, что вам это надо. Например, там заглавие главы вашего романа...

А вот четвертая строка не выполнится, потому что претендует на изменение текста (функция setline). Вим выдаст сообщение, что в песочнице так нельзя. И вы будете знать, что при чтении modeline была попытка сделать что-то небезопасное. Если вы этого хотели, сделайте вручную. А вот если не хотели, то скажите "спасибо".

Не забудьте, что флаг modeline надо выставить, если вы хотите считывать опции при чтении файла. Это удобно, но в безопасной среде. Если же вы открываете файлы, присланные невесть от кого, лучше этот флаг сбросить: песочница защищает, но рисковать всё равно не следует.

Еще надо помнить про опцию secure, которая запрещает опасные команды в файлах .vimrc и .exrc. По умолчанию она включена на Unix только тогда, когда эти файлы вам не принадлежат (хотя бы один). Можно вообще отключить эти файлы, сбросив флаг exrc. Это для работы в совсем уж токсичной среде...

Удачи, коллеги!