Как я могу предотвратить (или, по крайней мере, запросить подтверждение) абсурдно большие числа от использования в качестве префикса команд?

9

Это случается не так часто, как вы думаете, но иногда бывает, и у меня даже нет кошки.

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

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

Стивен Лу
источник
4
Просто чтобы быть уверенным, что я понимаю ваш вопрос: вы регулярно вводите по ошибке какую-то последовательность вроде 144477@@или, 99999.и хотите остановить выполнение, если число слишком велико? Я прав? (Я должен спросить, потому что это кажется немного странным, у меня никогда не было этой проблемы)
statox
3
Почему бы не обратить внимание на то, что вы делаете?
romainl
3
@statox да, все верно. У romainl тоже есть веская точка зрения, но она не имеет отношения к вопросу. Вопрос остается, и он может быть не таким «серьезным», как другие вопросы, но, тем не менее, это вопрос. Я просто думаю, что имеет смысл указывать верхнюю границу для предотвращения случайного отказа в обслуживании. Что касается предложения об уровнях отмены, да, это может быть уместно, если это также переполняет буфер отмены, я также не рассматривал его. (Не очень надуманный пример - у меня клавиатура на 60%, верхний ряд с границами - цифры. Я поднимаю ее рукой. Забудьте отключить ее и т. Д.)
Стивен Лу,
4
Вы можете использовать set showcmdдля отображения клавиш, которые вы ввели в правом нижнем углу.
Мартин Турной
1
@Carpetsmoker Я думаю, это можно было бы квалифицировать как «запрос на подтверждение», поскольку он отображается на экране. Я рекомендую добавить его в качестве ответа (вероятно, вместе с тем, как добавить его в качестве параметра по умолчанию .vimrc, чтобы ответ был полностью автономным.)
Wildcard

Ответы:

2

Я считаю, что вы обычно можете прервать процесс повторения, отправив SIGINT ( Ctrl+C). До тех пор, пока в некоторых vimscript не выполняется действительно длинный внутренний цикл, проблем с DoS нет.

Смотрите здесь пример того, как плагин может содержать функцию, которая зацикливается в зависимости от введенного числа.

Практически для всех целей и задач этот вопрос является гипотетическим.

Стивен Лу
источник
4
«Этот вопрос является гипотетическим» ... Нет, это не так. Мне приходилось работать над SSH на моем телефоне через соединения 2G, где я случайно пропустил нажатие клавиши или сделал несколько нажатий клавиш при вводе в ожидании, что привело к очень похожим ситуациям (возможно, не 99999, но меньшие цифры да).
Муру
Круто, да, медленный эмулятор терминала (в зависимости от количества изменений, которые применяет vim) может усугубить проблемы, добавив задержку обработки на стороне клиента. Должен быстро добраться до Ctrl + C!
Стивен Лу
1
Вы можете просто использовать <Esc>, вам не нужно использовать <C-c>. Разница в том, что <C-c>прерывает все, что делает Vim (например, запускает функцию), а <Esc>не делает. Вы почти никогда не захотите использовать, <C-c>если не хотите «убить» что-то.
Мартин Турной