Права доступа
По умолчанию команда доступна только владельцу. Более широкий доступ вы открываете осознанно.
Только владелец — это умолчание
func (m *Weather) CommandMetas() map[string]goroku.CommandMeta {
return map[string]goroku.CommandMeta{
"weather": {OnlyOwner: true},
}
}OnlyOwner проверяет только личность — он игнорирует sudo, временные выдачи и групповые маски. Используйте его для всего, что трогает ваш аккаунт, файлы или шелл.
Маски прав
Для команд, которыми могут пользоваться другие, в Goroku есть система битовых масок. Владелец назначает маски в рантайме через .security; ваш модуль ничего не объявляет, если вас устраивает умолчание.
| Константа | Кому даёт |
|---|---|
OWNER | Владельцу аккаунта |
SUDO | Пользователям из списка sudo |
GROUP_OWNER | Создателю группы |
GROUP_ADMIN | Любому админу |
GROUP_ADMIN_BAN_USERS | Админам с правом бана |
GROUP_ADMIN_DEL_MSGS | Админам с правом удаления |
GROUP_ADMIN_PIN_MSGS | Админам с правом закрепления |
GROUP_ADMIN_ADD_ADMINS | Админам, которые могут назначать админов |
GROUP_ADMIN_CHANGE_INFO | Админам, которые могут менять информацию |
GROUP_ADMIN_INVITE | Админам, которые могут приглашать |
GROUP_MEMBER | Любому участнику группы |
PM | Любому в личном чате |
EVERYONE | Кому угодно и где угодно |
Они комбинируются:
GROUP_ADMIN_BAN_USERS | GROUP_OWNEREVERYONE — это буквально все
EVERYONE позволяет любому постороннему в любом чате выполнить команду от имени вашего аккаунта. Сначала посмотрите на GROUP_MEMBER или конкретное админское право.
Проверка внутри обработчика
func (m *Mod) DangerousCmd(msg *goroku.Message) error {
sm := m.Client.GetSecurityManager()
if sm == nil || !sm.IsOwner(msg.SenderID) {
return msg.Answer(m.T("owner_only", "🚫 <b>Только для владельца</b>"))
}
return m.doIt(msg)
}Декларативный OnlyOwner предпочтительнее — диспетчер отсеет вызов до вашего кода, и не будет пути, на котором вы забыли проверку.
Если модуль будут ставить другие
Устанавливая ваш модуль, человек отдаёт ему свою сессию Telegram и свой сервер. Что стоит делать:
- По умолчанию — самые узкие права. Расширяйте только там, где это нужно функции.
- Никогда не логируйте секреты. Помечайте поля настроек
Secret: true(Настройки). - Экранируйте пользовательский ввод перед вставкой в HTML (Ответы).
- Проверяйте перед действием. ID чата или путь, пришедшие от пользователя, заслуживают проверки.
- Не передавайте пользовательский ввод в шелл. Если нужно запустить команду, передавайте аргументы слайсом, а не собирайте строку для оболочки.
// Нормально: аргументы отдельны, оболочка не участвует.
exec.CommandContext(ctx, "ffmpeg", "-i", path, out)
// Плохо: имя файла с кавычкой превращается в инъекцию в шелл.
exec.CommandContext(ctx, "sh", "-c", "ffmpeg -i "+path)Удалённый код
Модули, загружаемые по сети, скачиваются только по HTTPS, а приватные, loopback, link-local и CGNAT-адреса отклоняются — причём проверяется разрешённый IP, а не только имя хоста, так что фокусы с DNS не помогут.
Это защищает транспорт. О безопасности самого кода это не говорит ничего. Нативный модуль — произвольный Go в вашем процессе; прочитайте его перед установкой.