美文网首页
go初探-代理服务器

go初探-代理服务器

作者: 菜的无法无天 | 来源:发表于2021-04-27 20:07 被阅读0次

缘由

上线的应用作渗透测试和安全测试,提了一个静态资源访问风险。静态资源存储在oss服务器上,配置为公共读,一般情况下直接返回前端静态资源的公网地址,给前端页面进行渲染,没有做多余的权限校验。测评公司认为是中风险,为了渗透测试报告和安全测试报告,认怂,想办法修改😢

方案

  • oss部署在内网环境,我们通过nginx将其转发到公网上,想简单的配置一下,看能不能糊弄过测评人员,就在nginx添加了Referer配置,阻隔非同源网页的静态资源访问,本来以为意思意思,没想到被现实打击了,此方法失败
  • 对方要求静态资源需要加上用户的token,要校验token来验证访问,nginx貌似无法配置自定义验证,我就想到写一个类似于nginx的代理服务器,验证token合法后,将继续转发将请求转发到oss服务器上,验证不通过则直接返回403拒绝服务

实现

刚好最近一直在学习go语言,被其强大的语法所震惊,决定抛弃java使用用go语言来写(我感觉使用webflux实现应该差不多)。
在系统服务中,文件服务器被单独独立出来,我们根据文件的主键id调用rpc服务查询出文件的url,在这个切点,在文件的url路径后面拼接了经过aes加密后的token信息,在代理服务器,如果解析到用户的token并且验证token合法后,将请求正常转发

package tcp

import (
    "github.com/go-redis/redis"
    aeswarp "go-test/aes-warp"
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
    "strings"
)

var rdb *redis.Client

func init() {
    rdb = redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379",
        Password: "root",
        DB:       0,
        PoolSize: 3,
    })
}

func ForwardHandler(writer http.
    ResponseWriter, request *http.Request) {
    //aeswarp.Decrypt()
    query := request.URL.Query()
    query_code := query["code"]
    if len(query_code) == 0 {
        writer.WriteHeader(403)
        writer.Write([]byte("No right access"))
        return
    }
    code := query_code[0]
    token, err := aeswarp.Decrypt(code)
    if err != nil {
        writer.WriteHeader(403)
        writer.Write([]byte("No right access"))
        return
    }
    _, err = rdb.Get(token).Result()
    if err != nil {
        writer.WriteHeader(403)
        writer.Write([]byte("No right access"))
        return
    }
    u, err := url.Parse("https://douguohai.oss-cn-shenzhen.aliyuncs.com")
    if nil != err {
        log.Println("url parse error")
    }

    proxy := httputil.ReverseProxy{
        Director: func(req *http.Request) {
            req.Host = u.Host
            req.URL.Scheme = u.Scheme
            req.URL.Host = u.Host
            req.URL.Path = strings.Split(request.RequestURI, "?")[0]
        },
    }
    proxy.ServeHTTP(writer, request)
}

//代理服务器
func RunServer() {
    http.HandleFunc("/", ForwardHandler)
    http.ListenAndServe(":7777", nil)
}

完结

经过验证,实现了静态资源添加授权访问,看明天测评公司怎么说,咋要一份渗透报告和安全测试报告这么难呢😭

相关文章

  • go初探-代理服务器

    缘由 上线的应用作渗透测试和安全测试,提了一个静态资源访问风险。静态资源存储在oss服务器上,配置为公共读,一般情...

  • Golang Context

    参考Go语言实战笔记(二十)| Go ContextGolang context初探 一、WaitGroup 这是...

  • Go初探

    package main import “fmt” func main(){ fmt.Println(“hello...

  • Go初探

    1 Go语言特性 自动垃圾回收 更丰富的内置类型 函数多返回值 错误处理 匿名函数和闭包 类型和接口 并发编程 反...

  • Android Go初探

    Android Ore(Go edition) 简介:  Android Go并不是一个独立的操作系统,它只是An...

  • Go语言初探

    官方网站:https://golang.org/标准库文档:https://golang.org/pkg/在线编码...

  • Go语言初探

    Go语言教程 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由Robe...

  • go iris初探

    首先安装go环境。 安装iris 创建一个go的工作路径 编辑main.go 启动server 这样就完成了第一次...

  • 17 Go并发编程(四):sync 同步 —— Go并发的安全机

    Go 同步机制 在《Go并发编程初探》中我们提到同步概念,所谓同步是相对异步而言,即串行相对于并行。 同步机制解决...

  • golang module 详解系列

    初探module下的包管理在go modules中使用replace替换无法直接获取的package(golang...

网友评论

      本文标题:go初探-代理服务器

      本文链接:https://www.haomeiwen.com/subject/vbuprltx.html