Golang에서 빈번한 IP 액세스 금지를 구현하는 방법

PHPz
풀어 주다: 2023-04-25 10:24:39
원래의
1113명이 탐색했습니다.

애플리케이션 개발 시 잦은 접속을 금지하는 것은 DDOS 공격 등 다양한 공격을 예방하는 데 도움이 되는 핵심 보안 조치입니다. 이 기사에서는 Golang을 사용하여 IP 주소에 대한 빈번한 액세스를 금지하는 간단한 프로그램을 작성하는 방법을 소개합니다.

구현 아이디어

IP 주소별 빈번한 접속을 금지하는 구현 방법은 주로 IP 주소별 접속 횟수를 제한하는 방식으로 이루어집니다. 구체적인 아이디어는 다음과 같습니다.

  1. 지도를 만들어 각 IP 주소에 대한 방문 횟수를 기록합니다.
  2. IP 주소가 애플리케이션에 액세스하면 지도에서 IP 주소 카운터의 값을 늘립니다.
  3. IP 주소의 카운터가 지정된 제한 시간을 초과한 것으로 확인되면 IP 주소를 블랙리스트에 추가하고 애플리케이션에 대한 액세스를 금지합니다.
  4. IP 주소 블랙리스트가 너무 오래 지속되지 않도록 카운터의 시간 초과를 설정할 수 있습니다.

코드 구현

다음은 Golang을 사용하여 위 아이디어를 구현한 코드 예제입니다.

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()
}
로그인 후 복사

위 코드에서는 맵(ipRequestMap)을 사용하여 각 IP 주소에 대한 방문 횟수를 기록하고 (블랙리스트)를 블랙리스트 정보 저장에 매핑합니다. IP 주소가 애플리케이션에 액세스하면 먼저 IP 주소가 블랙리스트에 있는지 확인하고 그렇다면 403 Access Forbidden을 반환합니다. 그렇지 않은 경우 IP 주소에 대한 방문 횟수를 기록하십시오. IP 주소에 대한 방문 횟수가 지정된 임계값(MaxRequestsPerIP)을 초과하면 IP 주소를 블랙리스트에 추가하고 애플리케이션에 대한 액세스를 금지합니다.

isBlacklisted() 함수에서는 IP가 블랙리스트에 있는지 여부를 확인합니다. 그렇다면 true를 반환하여 해당 IP의 요청을 거부해야 한다고 StartHttpServer() 함수에 알립니다. 동시에 해당 IP가 블랙리스트 제한 시간(BlacklistTimeout)을 초과한 경우 블랙리스트에서 삭제됩니다.

recordIPRequest() 함수에서는 동시성 안전성을 보장하기 위해 RWMutex(RW mutex lock)를 사용합니다. 이 기능은 IP 주소에 대한 액세스 횟수를 기록하는 데 사용됩니다. IP가 설정된 한도에 도달하면 블랙리스트에 추가됩니다.

요약

Golang을 사용하여 빈번한 IP 접근을 차단하는 방법은 매우 간단합니다. 카운터와 블랙리스트만 구현하면 됩니다. 그러나 실제로는 우리 자신의 필요에 따라 적절한 임계값을 설정해야 합니다. 이 문서의 예에서는 최대 요청 수(MaxRequestsPerIP)와 블랙리스트 시간 초과(BlacklistTimeout)라는 두 가지 임계값을 사용합니다. 실제로는 특정 상황에 따라 보다 적절한 임계값을 설정할 수 있습니다.

위 내용은 Golang에서 빈번한 IP 액세스 금지를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!