Права доступу
За замовчуванням команда доступна лише власнику. Ширший доступ ви відкриваєте свідомо.
Лише власник — це замовчування
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 у вашому процесі; прочитайте його перед встановленням.