安全RCE之未授权访问分析(6)
2023-05-02 来源:飞速影视
当调用其ServeHTTP方法时就会调用函数本身。
中间件
框架中还有一个重要的功能是中间件,所谓中间件,就是连接上下级不同功能的函数或者软件。通常就是包裹函数为其提供和添加一些功能或行为。前文的就能把签名为func(w http.ResponseWriter, r *http.Reqeust)的函数转换成handler。这个函数也算是中间件。
了解实现概念,在具有相关基础知识前提下就可以尝试着手动进行实践,达到学以致用,融会贯通。下面就来动手实现两个中间件LogMiddleware和AuthMiddleware,一个用于日志记录的,一个用于权限校验。可以使用两种写法。
写法一
package mainimport ( "log" "net/http" "time" "encoding/json")//权限认证中间件type AuthMiddleware struct { Next http.Handler}//日志记录中间件type LogMiddleware struct { Next http.Handler //这里为AuthMiddleware}//返回信息结构体type Company struct { ID int Name string Country string}//权限认证请求处理func (am *AuthMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { //如果没有嵌套中间件则使用默认的DefaultServeMux if am.Next == nil { am.Next = http.DefaultServeMux } //判断Authorization头是否不为空 auth := r.Header.Get("Authorization") if auth != "" { am.Next.ServeHTTP(w, r) }else{ //返回401 w.WriteHeader(http.StatusUnauthorized) }}//日志请求处理func (am *LogMiddleware) ServeHTTP(w http.ResponseWriter, r *http.Request) { if am.Next == nil { am.Next = http.DefaultServeMux } start := time.Now() //打印请求路径 log.Printf("Started %s %s", r.Method, r.URL.Path) //调用嵌套的中间件,这里为AuthMiddleware am.Next.ServeHTTP(w, r) //打印请求耗时 log.Printf("Comleted %s in %v", r.URL.Path, time.Since(start))}func main() { //注册路由 http.HandleFunc("/user", func(w http.ResponseWriter, r *http.Request) { //实例化结构体返回json格式数据 c := &Company{ ID:123, Name:"TopSec", Country: "CN", } enc := json.NewEncoder(w) enc.Encode(c) }) //监听端口绑定自定义中间件 http.ListenAndServe(":8000",&LogMiddleware{ Next:new(AuthMiddleware), })}
本站仅为学习交流之用,所有视频和图片均来自互联网收集而来,版权归原创者所有,本网站只提供web页面服务,并不提供资源存储,也不参与录制、上传
若本站收录的节目无意侵犯了贵司版权,请发邮件(我们会在3个工作日内删除侵权内容,谢谢。)
www.fs94.org-飞速影视 粤ICP备74369512号