애플리케이션 개발 시 잦은 접속을 금지하는 것은 DDOS 공격 등 다양한 공격을 예방하는 데 도움이 되는 핵심 보안 조치입니다. 이 기사에서는 Golang을 사용하여 IP 주소에 대한 빈번한 액세스를 금지하는 간단한 프로그램을 작성하는 방법을 소개합니다.
구현 아이디어
IP 주소별 빈번한 접속을 금지하는 구현 방법은 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!