緣由
上線的應用作滲透測試和安全測試,提了一個靜態(tài)資源訪問風險姨蟋。靜態(tài)資源存儲在oss服務器上屉凯,配置為公共讀,一般情況下直接返回前端靜態(tài)資源的公網(wǎng)地址眼溶,給前端頁面進行渲染悠砚,沒有做多余的權限校驗。測評公司認為是中風險堂飞,為了滲透測試報告和安全測試報告灌旧,認慫,想辦法修改??
方案
- oss部署在內(nèi)網(wǎng)環(huán)境酝静,我們通過nginx將其轉發(fā)到公網(wǎng)上节榜,想簡單的配置一下,看能不能糊弄過測評人員别智,就在nginx添加了Referer配置宗苍,阻隔非同源網(wǎng)頁的靜態(tài)資源訪問,本來以為意思意思薄榛,沒想到被現(xiàn)實打擊了讳窟,此方法失敗
- 對方要求靜態(tài)資源需要加上用戶的token,要校驗token來驗證訪問敞恋,nginx貌似無法配置自定義驗證丽啡,我就想到寫一個類似于nginx的代理服務器,驗證token合法后硬猫,將繼續(xù)轉發(fā)將請求轉發(fā)到oss服務器上补箍,驗證不通過則直接返回403拒絕服務
實現(xiàn)
剛好最近一直在學習go語言改执,被其強大的語法所震驚,決定拋棄java使用用go語言來寫(我感覺使用webflux實現(xiàn)應該差不多)坑雅。
在系統(tǒng)服務中辈挂,文件服務器被單獨獨立出來,我們根據(jù)文件的主鍵id調(diào)用rpc服務查詢出文件的url裹粤,在這個切點终蒂,在文件的url路徑后面拼接了經(jīng)過aes加密后的token信息,在代理服務器遥诉,如果解析到用戶的token并且驗證token合法后拇泣,將請求正常轉發(fā)
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)
}
完結
經(jīng)過驗證,實現(xiàn)了靜態(tài)資源添加授權訪問矮锈,看明天測評公司怎么說霉翔,咋要一份滲透報告和安全測試報告這么難呢??