perf: 将管理员校验的字段改为userid,从而解决普通用户绕过校验的问题 (#175)

This commit is contained in:
二丫讲梵
2023-04-05 16:49:57 +08:00
committed by GitHub
parent 187566dd91
commit 9c85125907
6 changed files with 16 additions and 5 deletions

View File

@@ -377,7 +377,9 @@ allow_groups:
- "学无止境"
# 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
allow_users: ["张三","李四"]
# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
# 比如 ["1301691029702722","1301691029702733"]这个信息需要在钉钉管理后台的通讯录当中获取https://oa.dingtalk.com/contacts.htm#/contacts
# 注意如果下边的app_secrets为空以及使用outgoing的方式配置机器人这两种情况下都表示没有人是管理员
admin_users: []
# 钉钉机器人在应用信息中的AppSecret为了校验回调的请求是否合法如果留空将会忽略校验则该接口将会存在其他人也能随意调用的安全隐患因此强烈建议配置正确的secret如果你的服务对接给多个机器人这里可以配置多个机器人的secret
app_secrets: []

View File

@@ -24,7 +24,9 @@ chat_type: "0"
allow_groups: []
# 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
allow_users: []
# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的名称,比如 ["张三","李四"]
# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
# 比如 ["1301691029702722","1301691029702733"]这个信息需要在钉钉管理后台的通讯录当中获取https://oa.dingtalk.com/contacts.htm#/contacts
# 注意如果下边的app_secrets为空以及使用outgoing的方式配置机器人这两种情况下都表示没有人是管理员
admin_users: []
# 钉钉机器人在应用信息中的AppSecret为了校验回调的请求是否合法如果留空将会忽略校验则该接口将会存在其他人也能随意调用的安全隐患因此强烈建议配置正确的secret如果你的服务对接给多个机器人这里可以配置多个机器人的secret
app_secrets: []

View File

@@ -19,7 +19,10 @@ services:
CHAT_TYPE: "0" # 限定对话类型 0不限 1只能单聊 2只能群聊
ALLOW_GROUPS: "" # 哪些群组可以进行对话,如果留空,则表示允许所有群组,如果要限制,则填写群组的名字,比如 "aa,bb"
ALLOW_USERS: "" # 哪些用户可以进行对话,如果留空,则表示允许所有用户,如果要限制,则填写用户的名字,比如 "张三,李四"
ADMIN_USERS: "" # 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则写用户的名字,比如 "张三,李四"
# 指定哪些人为此系统的管理员,如果留空,则表示没有人是管理员,如果要限制,则列表中写用户的userid
# 比如 "1301691029702722,1301691029702733"这个信息需要在钉钉管理后台的通讯录当中获取https://oa.dingtalk.com/contacts.htm#/contacts
# 注意如果下边的app_secrets为空以及使用outgoing的方式配置机器人这两种情况下都表示没有人是管理员
ADMIN_USERS: ""
APP_SECRETS: "" # 钉钉机器人在应用信息中的AppSecret为了校验回调的请求是否合法如果留空将会忽略校验则该接口将会存在其他人也能随意调用的安全隐患因此强烈建议配置正确的secret如果你的服务对接给多个机器人这里可以配置多个机器人的secret比如 "xxxx,yyyy"
HELP: "欢迎使用本工具\n\n你可以查看[用户指南](https://github.com/eryajf/chatgpt-dingtalk/blob/main/docs/userGuide.md)\n\n这是一个[开源项目](https://github.com/eryajf/chatgpt-dingtalk/),觉得不错你可以来波素质三连." # 帮助信息,放在配置文件,可供自定义
volumes:

View File

@@ -56,7 +56,7 @@ func Start() {
}
return nil
}
if !public.JudgeGroup(msgObj.GetChatTitle()) && !public.JudgeUsers(msgObj.SenderNick) && !public.JudgeAdminUsers(msgObj.SenderNick) {
if !public.JudgeGroup(msgObj.GetChatTitle()) && !public.JudgeUsers(msgObj.SenderNick) && !public.JudgeAdminUsers(msgObj.SenderStaffId) {
_, err = msgObj.ReplyToDingtalk(string(dingbot.TEXT), "抱歉,您不在该机器人对话功能的白名单当中!")
if err != nil {
logger.Warning(fmt.Errorf("send message error: %v", err))

View File

@@ -16,7 +16,7 @@ import (
// SelectHistory 查询会话历史
func SelectHistory(rmsg *dingbot.ReceiveMsg) error {
name := strings.TrimSpace(strings.Split(rmsg.Text.Content, ":")[1])
if !public.JudgeAdminUsers(rmsg.SenderNick) {
if !public.JudgeAdminUsers(rmsg.SenderStaffId) {
_, err := rmsg.ReplyToDingtalk(string(dingbot.MARKDOWN), "**🤷 抱歉,您没有查询对话记录的权限,只有程序管理员可以查询!**")
if err != nil {
logger.Error(fmt.Errorf("send message error: %v", err))

View File

@@ -57,6 +57,10 @@ func JudgeUsers(s string) bool {
// JudgeAdminUsers 判断用户是否为系统管理员
func JudgeAdminUsers(s string) bool {
// 如果secret或者用户的userid都为空的话那么默认没有管理员
if len(Config.AppSecrets) == 0 || s == "" {
return false
}
// 如果没有指定,则没有人是管理员
if len(Config.AdminUsers) == 0 {
return false