Dalam pembangunan aplikasi, melarang akses kerap ialah langkah keselamatan utama yang boleh membantu anda mencegah pelbagai serangan, seperti serangan DDOS. Artikel ini akan memperkenalkan cara menggunakan Golang untuk menulis program mudah untuk melarang akses kerap kepada alamat IP.
Idea Pelaksanaan
Kaedah pelaksanaan melarang akses kerap alamat IP terutamanya dicapai dengan mengehadkan bilangan akses kepada setiap alamat IP. Idea khusus adalah seperti berikut:
Pelaksanaan kod
Berikut ialah contoh kod yang menggunakan Golang untuk melaksanakan idea di atas:
package main import ( "fmt" "net" "sync" "time" ) const ( MaxRequestsPerIP = 10 // 每个IP最大请求数 BlacklistTimeout = 60 * 5 // 黑名单超时时间(秒) ) type IPRequests struct { Requests int // 请求计数器 LastAccess time.Time // 最后一次访问时间 } var ( lock sync.RWMutex ipRequestMap = make(map[string]*IPRequests) blacklist = make(map[string]time.Time) ) // 判断IP是否在黑名单内 func isBlacklisted(ip string) bool { lock.RLock() defer lock.RUnlock() if blacklistedTime, ok := blacklist[ip]; ok { if time.Since(blacklistedTime) < time.Second*BlacklistTimeout { return true } else { // 超时,从黑名单中删除 lock.Lock() delete(blacklist, ip) lock.Unlock() } } return false } // 记录IP访问次数 func recordIPRequest(ip string) { lock.Lock() defer lock.Unlock() req, ok := ipRequestMap[ip] if !ok { req = &IPRequests{} ipRequestMap[ip] = req } req.Requests++ req.LastAccess = time.Now() // 如果IP访问次数过多,将其列入黑名单 if req.Requests > MaxRequestsPerIP { blacklist[ip] = time.Now() } } // 启动HTTP服务器 func StartHttpServer() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { ip, _, _ := net.SplitHostPort(r.RemoteAddr) // 如果IP地址在黑名单内,则拒绝访问 if isBlacklisted(ip) { http.Error(w, http.StatusText(http.StatusForbidden), http.StatusForbidden) return } // 记录IP地址的访问次数 recordIPRequest(ip) // 处理请求 fmt.Fprintf(w, "Hello, %s!", r.URL.Path[1:]) }) http.ListenAndServe(":8080", nil) } func main() { StartHttpServer() }
Dalam kod di atas, kami menggunakan peta (ipRequestMap) Untuk merekodkan bilangan lawatan ke setiap alamat IP, peta (senarai hitam) digunakan untuk menyimpan maklumat senarai hitam. Apabila alamat IP mengakses aplikasi kami, kami mula-mula menyemak sama ada alamat IP berada dalam senarai hitam, dan jika ya, kembalikan 403 Access Forbidden. Jika tidak, rekodkan bilangan lawatan ke alamat IP. Apabila bilangan lawatan ke alamat IP melebihi ambang yang ditentukan (MaxRequestsPerIP), kami menyenaraihitamkan alamat IP dan melarang akses kepada aplikasi kami.
Dalam fungsi isBlacklisted(), kami menentukan sama ada IP berada dalam senarai hitam. Jika ya, kembalikan benar, memberitahu fungsi StartHttpServer() bahawa kita harus menolak permintaan daripada IP tersebut. Pada masa yang sama, jika IP telah melebihi tamat masa senarai hitam (BlacklistTimeout), ia akan dipadamkan daripada senarai hitam.
Dalam fungsi recordIPRequest(), kami menggunakan RWMutex (RW mutex lock) untuk memastikan keselamatan serentak. Fungsi ini digunakan untuk merekodkan bilangan kali alamat IP diakses Jika IP mencapai had yang kami tetapkan, ia akan disenaraihitamkan.
Ringkasan
Kaedah untuk menggunakan Golang untuk mengharamkan akses IP yang kerap adalah sangat mudah. Kita hanya perlu melaksanakan kaunter dan senarai hitam. Tetapi dalam amalan, kita perlu menetapkan ambang yang sesuai mengikut keperluan kita sendiri. Dalam contoh artikel ini, kami menggunakan dua ambang: bilangan maksimum permintaan (MaxRequestsPerIP) dan tamat masa senarai hitam (BlacklistTimeout). Dalam amalan, anda boleh menetapkan ambang yang lebih sesuai mengikut situasi tertentu.
Atas ialah kandungan terperinci Bagaimana untuk melaksanakan larangan ke atas capaian IP yang kerap di Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!