Taoshi 55 Опубликовано: 29 января, 2022 (изменено) Краткий пример кода для openOS, позволяющий обезопасить ваш терминал от посторонних. Если вы играете на сервере, то наверняка сталкивались с проблемой необходимости блокировки доступа ввода данных посторонними в ваш компьютер/робота. Этот коротенький скрипт поможет вам. План действий: Итак, включаем компьютер. Пишем в консоли edit z_protect (или любое другое название файла) В открывшемся редакторе файлов вписываем (или просто копируем отсюда) следующий код: Цитата event=require('event') function nah(_,_,_,_,u) if u~='ник_игрока' --сюда вместо ник_игрока надо вписать ваш ник в игре then io.read() end end return event.listen('key_up',nah) Не забудьте вписать ваш игровой ник. Сохраняем, выходим из редактора. Теперь после запуска этого файла никто кроме вас не сможет вводить команды в терминал. Отключить 'слушателя' можно командой Цитата event.cancel(номер_слушателя) Если вам неизвестен номер, можно отключить всех слушателей: Цитата local n=0 while event.cancel(true) do print ('listener '..n..'terminated') n=n+1 end Но это, конечно, если у вас нет каких-то важных перехватчиков. Если они есть вам следует позаботиться о том, чтобы знать номер каждого из них. Если у вас возникнет желание сделать автозапуск скрипта при включении компьютера - просто впишите название этого файла в файл .shrc Цитата z_protect После этого выключите и включите компьютер. Готово! Скрипт запустился и будет подменять строку ввода в консоль на своё поле ввода текста если ник пользователя не совпал. Вы можете добавить проверки для нескольких пользователей. Сделать это просто. Вписываем между if u~='ник пользователя' и then Цитата or u~='ник пользователя 2' Вставляем так ники всех, кому разрешён доступ к этому компу. На этом всё. Успеха в предотвращении доступа к вводу скриптов через ваши терминалы злоумышленниками. Изменено 29 января, 2022 пользователем Taoshi Добавлено описание метода отключения скрипта 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
hohserg 197 Опубликовано: 29 января, 2022 Есть же computer.addUser https://ocdoc.cil.li/computer_users 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asior 586 Опубликовано: 29 января, 2022 38 минут назад, hohserg сказал: Есть же computer.addUser https://ocdoc.cil.li/computer_users Если это робот, то оно при движении слетает. Так что да, как вариант такой способ вполне себе рабочий. Хотя достаточно зажать ctrl+alt+c и вся защита пропадает. А блокировать комбинацию не всегда надо. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 29 января, 2022 5 часов назад, Taoshi сказал: Отключить 'слушателя' можно командой Цитата event.cancel(номер_слушателя) event.cancel() отменяет таймер. Для отмены слушателя нужен event.ignor(), а для его работы нужен указатель на функцию-слушатель, который остался в z_protect. Так что просто так отключить не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi Автор темы 55 Опубликовано: 30 января, 2022 Это просто пример как можно осуществить протект, не более. Кстати комбо ctrl+alt+c у меня не работает :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 1 февраля, 2022 В 29.01.2022 в 17:08, Asior сказал: Если это робот, то оно при движении слетает. Вроде бы раньше список пользователей слетал только при переустановке робота, а движение самого робота не приводило к сбросу списка. Когда это изменилось? Или оно всегда так работало? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi Автор темы 55 Опубликовано: 1 февраля, 2022 2 часа назад, eu_tomat сказал: Вроде бы раньше список пользователей слетал только при переустановке робота, а движение самого робота не приводило к сбросу списка. Когда это изменилось? Или оно всегда так работало? Список изменится (обнулится) только в случае смены адреса устройства. При движении робота его адрес не меняется. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi Автор темы 55 Опубликовано: 1 февраля, 2022 (изменено) В 29.01.2022 в 18:28, hohserg сказал: Есть же computer.addUser https://ocdoc.cil.li/computer_users addUser не во всех случаях применим. Например, в софте могут использоваться ивенты касания монитора другими игроками (руками или ногами, не столь важно). П.С.: Также может быть использовано больше одной клавиатуры. В этом случае необходимо дополнительно проверять адрес откуда пришло событие. Но это уже частности. Изменено 1 февраля, 2022 пользователем Taoshi Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi Автор темы 55 Опубликовано: 1 февраля, 2022 В 29.01.2022 в 19:08, Asior сказал: В 29.01.2022 в 19:08, Asior сказал: Хотя достаточно зажать ctrl+alt+c и вся защита пропадает. А достаточно ли? Попробуйте... Мои тесты показали, что комбо неуказанного игрока перехватывается. В 29.01.2022 в 20:46, Zer0Galaxy сказал: event.cancel() отменяет таймер. Для отмены слушателя нужен event.ignor(), а для его работы нужен указатель на функцию-слушатель, который остался в z_protect. Так что просто так отключить не получится. Тут я с вами полностью согласен. Отключить полностью не удастся. И для безопасности это довольно хорошо. А после редактирования/отключения в автозагрузке и перезагрузки системы оно само пройдёт. Впрочем, если возникнет необходимость налёту отключать защиту (что в мои планы не входит), то реализовать это довольно просто. Например отправкой необходимых данных в <куда_нибудь> Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 2 февраля, 2022 В 29.01.2022 в 13:40, Taoshi сказал: Теперь после запуска этого файла никто кроме вас не сможет вводить команды в терминал. Ой, да сможет... Скрытый текст Может, новичка это остановит. Но достаточное количество переводов строк в буфере обмена поможет и препятствия вроде io.read() прочистить, и любую последовательность команд передать на выполнение. Доступ к интерпретатору команд Lua тоже не особо усложнится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgramCrafter 544 Опубликовано: 2 февраля, 2022 В 29.01.2022 в 15:40, Taoshi сказал: никто кроме вас не сможет вводить команды в терминал. Но кто угодно сможет скопировать команду в буфер обмена и вставить в комп. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi Автор темы 55 Опубликовано: 2 февраля, 2022 (изменено) 4 часа назад, eu_tomat сказал: Но достаточное количество переводов строк в буфере обмена поможет и препятствия вроде io.read() прочистить, и любую последовательность команд передать на выполнение. Доступ к интерпретатору команд Lua тоже не особо усложнится 1 час назад, ProgramCrafter сказал: Но кто угодно сможет скопировать команду в буфер обмена и вставить в комп. Угу. Инсерт не перехватывается внутренними средствами. А для ввода команды её надо запуллить после скопированного перевода строки Изменено 2 февраля, 2022 пользователем Taoshi Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgramCrafter 544 Опубликовано: 2 февраля, 2022 15 минут назад, Taoshi сказал: Нет? Не пробовали? Ну, теперь попробовал. Получилось. Что и было логично, потому что событие clipboard тоже надо перехватывать. И лучше бы (возможно) подменять computer.pullSignal, чтобы эвент просто не доходил до системы: в нынешнем варианте кто-то сможет мешать владельцу компа работать. 13 минуты назад, Taoshi сказал: выполнить файл который УЖЕ есть на диске В том числе и reboot. А код с pastebin - так тоже просто, есть же команда "pastebin run ..." Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 2 февраля, 2022 5 часов назад, ProgramCrafter сказал: И лучше бы (возможно) подменять computer.pullSignal, чтобы эвент просто не доходил до системы А может, лучше по старинке через computer.addUser? Или этот механизм всё-таки ломается при каких-то условиях? В 29.01.2022 в 17:08, Asior сказал: Если это робот, то оно при движении слетает. Есть какие-то идеи на этот счёт? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi Автор темы 55 Опубликовано: 3 февраля, 2022 19 часов назад, eu_tomat сказал: Есть какие-то идеи на этот счёт? Метод защиты робота есть. Он не так короток и прост, как хотелось бы, но всё ещё элементарен. Предварительно устанавливаем таймеры всех обработчиков событий в openOS в бесконечность(0). После этого прервать работу исполняемых программ с клавиатуры не представляется возможным. Роботу при сборке комплектуем motion sensor. Устанавливаем ранг сканирования в, допустим, 7 блоков. Запускаем новый обработчик события настроенный на работу с сенсором. Теперь, если в пределах указанного расстояния появляется неизвестный игрок и если расстояние меньше 5 (то есть может дотянуться до робота), есть варианты. Например: 1. Робот продолжает работу, так как после остановки обработчиков событий его программу прервать с клавиатуры вроде как невозможно. 2. Робот ничего не делал, автозапуска программ на нём нет, и ему надо защищаться. В обработчике событий движения смотрим, кто тут, и если что не так, то просто выполняем цикл ожидания в предпочитаемом по размеру промежутке времени. Например, начинаем 'зоонаблюдать' изнутри обработчика за дальнейшими ивентами датчика движения. Или агрессивно нападаем. Или предпочитаем тактический манёвр отступления. Ну тут уже вариантов уйма, лишь бы выполнялся код и не мельтешило приглашающее поле ввода на экране монитора робота. Экран, кстати говоря, можно отключить на период событий. Притвориться, что его и вовсе нет. Как, возможно, и клавиатуры :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Taoshi Автор темы 55 Опубликовано: 3 февраля, 2022 Так же предварительная остановка всех системных обработчиков событий и выполнение кода ожидания после включения должно предотвратить несанкционированный доступ, прекращая свою работу только по получению эвента нажатия от ожидаемого пользователя d:-D. Конечно, это не так элегантно как хотелось бы. А хотелось бы манить мерцающим полем ввода и не пущать :-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 3 февраля, 2022 1 час назад, Taoshi сказал: 22 часа назад, eu_tomat сказал: Есть какие-то идеи на этот счёт? Метод защиты робота есть. Он не так короток и прост, как хотелось бы, но всё ещё элементарен. Ой! Спасибо, конечно, но не такого ответа я ожидал. Уточню свой вопрос. Костыли меня интересуют в последнюю очередь. Интереснее другое: можно ли в данном случае обойтись без костылей? До этой темы многие из нас использовали стандартное решение: В 29.01.2022 в 16:28, hohserg сказал: Есть же computer.addUser https://ocdoc.cil.li/computer_users Но, как оказалось, не все столь же оптимистичны: В 29.01.2022 в 17:08, Asior сказал: Если это робот, то оно при движении слетает. Мой вопрос: Действительно ли список доступа computer.users слетает при движении робота, и как это воспроизвести? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 187 Опубликовано: 3 февраля, 2022 В локалке установил список доступа: userAdd Zer0Galaxy Проверил список: local computer = require "computer" for k,user in pairs({computer.users()}) do print( user ) end -- Zer0Galaxy Выполнил несколько движений, поворотов, действий с блоками: r=require"robot" for i=1,10 do r.forward(1) end r.swingDown() r.turnLeft() r.turnLeft() for i=1,10 do r.forward(1) end r.place() Снова проверил список: local computer = require "computer" for k,user in pairs({computer.users()}) do print( user ) end -- Zer0Galaxy 1 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
eu_tomat 2 154 Опубликовано: 3 февраля, 2022 @Zer0Galaxy У меня в локальной игре тоже всё работает. Да и на серверах раньше работало. Точнее говоря, я не помню каких-либо проблем. @Asior А ты можешь воспроизвести этот эксперимент на том сервере, где список пользователей слетает? И что за сервер, если не секрет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Asior 586 Опубликовано: 5 февраля, 2022 В 03.02.2022 в 13:01, eu_tomat сказал: А ты можешь воспроизвести этот эксперимент на том сервере, где список пользователей слетает? И что за сервер, если не секрет? Так, эксперимент провел на сервере кристаликса. Да, действительно useradd не слетает. И я собственно вспомнил, почему я считал, что такая защита не имеет смысла. Если заприватить компьютер, он становится практически нерушимым. А приват робота не дает только открыть его, а срубить и упереть может любой игрок. Ну а при разрушении собственно useradd слетает. Так что да, придется городить защиту. 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах