Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk melaksanakan larangan ke atas capaian IP yang kerap di Golang

Bagaimana untuk melaksanakan larangan ke atas capaian IP yang kerap di Golang

PHPz
PHPzasal
2023-04-25 09:10:491169semak imbas

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:

  1. Buat peta untuk merekodkan bilangan lawatan ke setiap alamat IP.
  2. Apabila alamat IP mengakses aplikasi kami, tingkatkan nilai kaunter alamat IP dalam peta.
  3. Jika kami mendapati bahawa kaunter alamat IP telah melebihi masa had yang ditetapkan, kami akan menyenaraihitamkan alamat IP dan melarang akses kepada aplikasi kami.
  4. Anda boleh menetapkan tamat masa kaunter untuk memastikan senarai hitam alamat IP tidak bertahan terlalu lama.

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn