ycvk / deeplx-local

自建deeplx服务
MIT License
148 stars 22 forks source link

为防止接口被扫描或滥用,是否可以添加一个 secretKey 在 url 中 #27

Closed forrany closed 2 months ago

forrany commented 3 months ago

如题,通过环境变量,添加一个密钥在 url 中,防止接口被扫描后滥用

提供一个参考

main 函数中,修复initServer函数

func initServer() {
    // 加载 .env 文件
    err := godotenv.Load()
    if err != nil {
        log.Fatal("Error loading .env file")
    }

    // 从环境变量中读取密钥
    secretKey := os.Getenv("API_SECRET_KEY")
    if secretKey == "" {
        log.Fatal("API_SECRET_KEY 环境变量未设置")
    }

    // 从文件中读取并处理URL
    urLs := getValidURLs()

    // 注册服务
    gin.SetMode(gin.ReleaseMode)
    r := gin.Default()
    balancerService := service.NewLoadBalancer(&urLs)
    lxHandler := web.NewDeepLXHandler(balancerService)
    lxHandler.RegisterRoutes(r)

    // 添加中间件来验证密钥
    r.Use(func(c *gin.Context) {
        if c.Query("key") != secretKey {
            c.AbortWithStatus(http.StatusNotFound)
            return
        }
        c.Next()
    })

    go func() {
        if err := endless.ListenAndServe("0.0.0.0:62155", r); err != nil && !errors.Is(err, http.ErrServerClosed) {
            log.Fatal("web服务启动失败: ", err)
        }
    }()
}

在同目录添加 .env 填入需要配置的密钥

ycvk commented 3 months ago

主要的问题在于大多数人使用这个都是为了 沉浸式翻译 这个插件,但这个插件不支持自定义 Authorization头或者添加任何验证的 authKey ,我能想到的防止被扫描端口滥用的方法就是在路由路径那里做

比如现在翻译地址是 http://localhost:8080/translate 那么可以自定义路由路径,比如 http://localhost:8080/{custom}/translate 这样就是被扫到端口是 8080,但是后端只暴露了这端口的 post 请求,没有任何其他方式可以获取到中间的 {custom} 路由路径,自然再去请求 http://localhost:8080/translate必定会 404 失败,这样能一定程度上防止被扫到默认端口就获取到服务地址了

forrany commented 3 months ago

主要的问题在于大多数人使用这个都是为了 沉浸式翻译 这个插件,但这个插件不支持自定义 Authorization头或者添加任何验证的 authKey ,我能想到的防止被扫描端口滥用的方法就是在路由路径那里做

比如现在翻译地址是 http://localhost:8080/translate 那么可以自定义路由路径,比如 http://localhost:8080/{custom}/translate 这样就是被扫到端口是 8080,但是后端只暴露了这端口的 post 请求,没有任何其他方式可以获取到中间的 {custom} 路由路径,自然再去请求 http://localhost:8080/translate必定会 404 失败,这样能一定程度上防止被扫到默认端口就获取到服务地址了

这个方案甚好,期待更新此特性❤️

ycvk commented 3 months ago

实现了,感觉与其 localhost:8080/{custom}/translate 不如直接全自定义成 localhost:8080/{custom} 不加这个变量就还是默认的 /translate, 这样想自定义成 /a/b/c/d/e 都行