Ukuthuthukiswa kweseva yewebhu e-Golang - kusuka kokulula kuye kokuyinkimbinkimbi

Ukuthuthukiswa kweseva yewebhu e-Golang - kusuka kokulula kuye kokuyinkimbinkimbi

Eminyakeni emihlanu edlule ngaqala ukuthuthukisa i-Gophish, lokhu kwanikeza ithuba lokufunda isiGolang. Ngabona ukuthi i-Go iwulimi olunamandla, oluhambisana nemitapo yolwazi eminingi. I-Go iyashintshashintsha: ikakhulukazi, ingasetshenziswa ukuthuthukisa izinhlelo zokusebenza eziseceleni kweseva ngaphandle kwezinkinga.

Lesi sihloko simayelana nokubhala iseva kokuthi Go. Ake siqale ngezinto ezilula njengokuthi "Sawubona mhlaba!" bese siphetha ngohlelo lokusebenza olunala makhono alandelayo:

- Ukusebenzisa i-Let Encrypt for HTTPS.
- Isebenza njengerutha ye-API.
- Ukusebenza nge-middleware.
- Ukucutshungulwa kwamafayela amile.
- Ukuvala shaqa okulungile.

I-Skillbox iyancoma: Isifundo esiwusizo "Python developer kusukela ekuqaleni".

Siyakukhumbuza: kubo bonke abafundi be-"Habr" - isaphulelo sama-ruble angu-10 lapho ubhalisa kunoma yisiphi isifundo se-Skillbox usebenzisa ikhodi yephromoshini ethi "Habr".

Sawubona Mhlaba!

Ungakha iseva yewebhu kokuthi Hamba ngokushesha okukhulu. Nasi isibonelo sokusebenzisa isibambi esibuyisela okuthi “Sawubona, mhlaba!” othenjiswe ngenhla.

package main
 
import (
"fmt"
"net/http"
)
 
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World!")
})
http.ListenAndServe(":80", nil)
}

Ngemuva kwalokhu, uma usebenzisa uhlelo bese uvula ikhasi localhost, khona-ke uzobona ngokushesha umbhalo othi “Sawubona, mhlaba!” (uma konke kusebenza kahle, kunjalo).

Sizosebenzisa isibambi izikhathi eziningi kamuva, kodwa masiqale siqonde ukuthi yonke into isebenza kanjani.

inetha/http

Isibonelo sisebenzise iphasela net/http, iyithuluzi eliyinhloko ku-Go lokuthuthukisa kokubili amaseva namaklayenti e-HTTP. Ukuze siqonde ikhodi, masiqonde incazelo yezinto ezintathu ezibalulekile: http.Handler, http.ServeMux kanye ne-http.Server.

Izibambi ze-HTTP

Uma sithola isicelo, isibambi siyasihlaziya futhi sikhiqize impendulo. Ama-Handlers ku-Go asetshenziswa ngendlela elandelayo:

type Handler interface {
        ServeHTTP(ResponseWriter, *Request)
}

Isibonelo sokuqala sisebenzisa umsebenzi womsizi we-http.HandleFunc. Igoqa omunye umsebenzi, wona othatha i-http.ResponseWriter kanye ne-http.Cela ku-ServeHTTP.

Ngamanye amazwi, izibambi ku-Golang zethulwa ku-interface eyodwa, okunikeza izinketho eziningi kumhleli. Ngakho-ke, isibonelo, i-middleware isetshenziswa kusetshenziswa isibambi, lapho i-ServeHTTP iqala yenza okuthile bese ibiza indlela ye-ServeHTTP yesinye isibambi.

Njengoba kushiwo ngenhla, abaphathi bamane bakhiqize izimpendulo ezicelweni. Kodwa yisiphi isibambi okufanele sisetshenziswe ngesikhathi esithile?

Cela Umzila

Ukuze wenze ukukhetha okufanele, sebenzisa i-HTTP multiplexer. Emitapo yolwazi eminingi ibizwa ngokuthi i-muxer noma i-router, kodwa zonke ziyinto efanayo. Umsebenzi we-multiplexer ukuhlaziya indlela yokucela bese ukhetha isibambi esifanele.

Uma udinga ukusekelwa kumzila oyinkimbinkimbi, ngakho-ke kungcono ukusebenzisa imitapo yolwazi yezinkampani zangaphandle. Okunye okuthuthuke kakhulu - gorilla/mux и go-chi/chi, lemitapo yolwazi yenza kube nokwenzeka ukusebenzisa ukucubungula okuphakathi ngaphandle kwezinkinga. Ngosizo lwabo, ungamisa umzila we-wildcard futhi wenze inombolo yeminye imisebenzi. Inzuzo yabo ukuhambisana nezibambi ze-HTTP ezijwayelekile. Ngenxa yalokho, ungabhala ikhodi elula engashintshwa esikhathini esizayo.

Ukusebenza ngezinhlaka eziyinkimbinkimbi esimweni esijwayelekile kuzodinga izixazululo ezingajwayelekile, futhi lokhu kwenza kube nzima kakhulu ukusetshenziswa kwezibambi ezizenzakalelayo. Ukwakha iningi lezinhlelo zokusebenza, inhlanganisela yelabhulali ezenzakalelayo kanye nomzila olula kuzokwanela.

Ukucutshungulwa kombuzo

Ngaphezu kwalokho, sidinga ingxenye "ezolalela" ekuxhumekeni okungenayo futhi iqondise kabusha zonke izicelo kusibambi esilungile. http.Iseva ingawuphatha kalula lo msebenzi.

Okulandelayo kubonisa ukuthi iseva inesibopho sayo yonke imisebenzi ehlobene nokucubungula uxhumano. Lokhu, ngokwesibonelo, kusebenza kusetshenziswa iphrothokholi ye-TLS. Ukuze wenze ikholi ye-http.ListenAndServer, kusetshenziswa iseva evamile ye-HTTP.

Manje ake sibheke izibonelo eziyinkimbinkimbi.

Yengeza Masibhale Ngemfihlo

Ngokuzenzakalelayo, uhlelo lwethu lokusebenza lusebenzisa iphrothokholi ye-HTTP, kodwa kuyanconywa ukusebenzisa umthetho olandelwayo we-HTTPS. Lokhu kungenziwa ngaphandle kwezinkinga ku-Go. Uma uthole isitifiketi nokhiye oyimfihlo, kusho ukuthi kwanele ukubhalisa i-ListenAndServeTLS ngesitifiketi esilungile namafayela angukhiye.

http.ListenAndServeTLS(":443", "cert.pem", "key.pem", nil)

Ungahlala wenza kangcono.

Masibhale inikeza izitifiketi zamahhala ngokuvuselelwa okuzenzakalelayo. Ukuze usebenzise isevisi, udinga iphakheji autocert.

Indlela elula yokuyilungiselela ukusebenzisa indlela ye-autocert.NewListener ihlanganiswe ne-http.Serve. Indlela ikuvumela ukuthi uthole futhi ubuyekeze izitifiketi ze-TLS ngenkathi iseva ye-HTTP icubungula izicelo:

http.Serve(autocert.NewListener("example.com"), nil)

Uma sivula kusiphequluli isibonelo.com, sizothola impendulo ye-HTTPS ethi “Sawubona, mhlaba!”

Uma udinga ukucushwa okunemininingwane eminingi, kuzomele usebenzise i-autocert.Manager manager. Bese sidala esethu isibonelo se-http.Server (kuze kube manje besiyisebenzisa ngokuzenzakalelayo) bese sengeza umphathi kuseva ye-TLSConfig:

m := &autocert.Manager{
Cache:      autocert.DirCache("golang-autocert"),
Prompt:     autocert.AcceptTOS,
HostPolicy: autocert.HostWhitelist("example.org", "www.example.org"),
}
server := &http.Server{
    Addr:      ":443",
    TLSConfig: m.TLSConfig(),
}
server.ListenAndServeTLS("", "")

Lena indlela elula yokusebenzisa usekelo olugcwele lwe-HTTPS ngokuvuselelwa kwesitifiketi okuzenzakalelayo.

Ingeza imizila yangokwezifiso

Irutha ezenzakalelayo efakwe kulabhulali evamile yinhle, kodwa iyisisekelo kakhulu. Izinhlelo zokusebenza eziningi zidinga umzila onzima kakhulu, ohlanganisa imizila evalelwe nekhadi lasendle, noma inqubo yokusetha amaphethini wendlela namapharamitha.

Kulokhu kufanelekile ukusebenzisa amaphakheji gorilla/mux и go-chi/chi. Sizofunda ukuthi singasebenza kanjani nalesi sakamuva - isibonelo siboniswe ngezansi.

Kunikezwe ifayela elithi api/v1/api.go eliqukethe imizila ye-API yethu:

/ HelloResponse is the JSON representation for a customized message
type HelloResponse struct {
Message string `json:"message"`
}
 
// HelloName returns a personalized JSON message
func HelloName(w http.ResponseWriter, r *http.Request) {
name := chi.URLParam(r, "name")
response := HelloResponse{
Message: fmt.Sprintf("Hello %s!", name),
}
jsonResponse(w, response, http.StatusOK)
}
 
// NewRouter returns an HTTP handler that implements the routes for the API
func NewRouter() http.Handler {
r := chi.NewRouter()
r.Get("/{name}", HelloName)
return r
}

Setha isiqalo se-api/vq semizila efayeleni elikhulu.

Singakwazi ke ukukhweza lokhu kumzila wethu oyinhloko ngaphansi kwesiqalo se-api/v1/ sibuyele ohlelweni lwethu oluyinhloko:

// NewRouter returns a new HTTP handler that implements the main server routes
func NewRouter() http.Handler {
router := chi.NewRouter()
    router.Mount("/api/v1/", v1.NewRouter())
    return router
}
http.Serve(autocert.NewListener("example.com"), NewRouter())

Ukusebenziseka kalula kwe-Go ngokusebenzisa imizila eyinkimbinkimbi kwenza kube lula ukwakheka nokugcinwa kwezinhlelo zokusebenza ezinkulu eziyinkimbinkimbi.

Ukusebenza nge-middleware

Ukwenza isiteji kuhlanganisa ukusonga isibambi esisodwa se-HTTP nesinye, okwenza kube lula ukwenza ubuqiniso ngokushesha, ukucindezela, ukugawula, neminye imisebenzi eminingana.

Njengesibonelo, ake sibheke isixhumi esibonakalayo se-http.Handler; sizosisebenzisa ukubhala isibambi esiqinisekisa abasebenzisi besevisi.

func RequireAuthentication(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if !isAuthenticated(r) {
            http.Redirect(w, r, "/login", http.StatusTemporaryRedirect)
            return
        }
        // Assuming authentication passed, run the original handler
        next.ServeHTTP(w, r)
    })
}

Kunamarutha ezinkampani zangaphandle, njenge-chi, akuvumela ukuthi unwebe ukusebenza kwe-middleware.

Ukusebenza ngamafayela amile

Umtapo wezincwadi ojwayelekile we-Go uhlanganisa amakhono okusebenza ngokuqukethwe okumile, okuhlanganisa izithombe, amafayela e-JavaScript kanye ne-CSS. Angafinyelelwa ngomsebenzi we-http.FileServer. Ibuyisela isibambi esinikeza amafayela asuka kuhla lwemibhalo oluthile.

func NewRouter() http.Handler {
    router := chi.NewRouter()
    r.Get("/{name}", HelloName)
 
// Настройка раздачи статических файлов
staticPath, _ := filepath.Abs("../../static/")
fs := http.FileServer(http.Dir(staticPath))
    router.Handle("/*", fs)
    
    return r

Kuhle impela ukukhumbula ukuthi i-http.Dir ibonisa okuqukethwe kunkomba uma ingenayo ifayela le-index.html eliyinhloko. Kulesi simo, ukuvimbela uhla lwemibhalo ukuthi lungangeni, kufanele usebenzise iphakheji unindexed.

Ukuvala shaqa okulungile

I-Go futhi inesici esibizwa ngokuthi ukuvala shaqa okuhle kweseva ye-HTTP. Lokhu kungenziwa kusetshenziswa indlela ye-Shutdown(). Iseva iqalwa nge-goroutine, bese isiteshi siyalalelwa ukuze sithole isignali yokuphazamiseka. Ngokushesha lapho isignali yamukelwa, iseva iyacisha, kodwa hhayi ngokushesha, kodwa ngemva kwemizuzwana embalwa.

handler := server.NewRouter()
srv := &http.Server{
    Handler: handler,
}
 
go func() {
srv.Serve(autocert.NewListener(domains...))
}()
 
// Wait for an interrupt
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt)
<-c
 
// Attempt a graceful shutdown
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(ctx)

Njengesiphetho

I-Go iwulimi olunamandla olunomtapo wolwazi cishe ojwayelekile. Amandla ayo azenzakalelayo abanzi kakhulu, futhi angathuthukiswa kusetshenziswa izixhumi ezibonakalayo - lokhu kukuvumela ukuthi uthuthukise amaseva athembekile we-HTTP.

I-Skillbox iyancoma:

Source: www.habr.com

Engeza amazwana