Go 애플리케이션을 개발할 때 SSRF(Server-Side Request Forgery)와 같은 취약점을 방지하려면 HTTP 요청을 보호하는 것이 중요합니다. SSRF는 공격자가 서버를 조작하여 의도하지 않은 요청을 하여 잠재적으로 내부 서비스나 민감한 데이터에 액세스할 때 발생합니다.
URL 구문 분석 및 유효성 검사 기술을 사용하여 HTTP 요청을 보호하는 방법을 살펴보고 http.Get HTTP GET 요청 핸들러를 강화하는 예제 코드를 제공합니다.
이미지를 가져오기 위해 사용자 자신의 도메인에 HTTP 요청을 보내는 HTTP 경로 핸들러 코드는 downloadAndResize라는 함수에서 다음과 같습니다(간결하게 축약).
func downloadAndResize(tenantID, fileID, fileSize string) error { // ... downloadResp, err := http.Get(info.Download) if (err != nil) { panic(err) } // ... }
Go 애플리케이션의 SSRF 취약성을 완화하려면 개발자는 입력을 검증 및 삭제하고 결과 도메인을 조작하지 않는 방식으로 URL을 안전하게 구성하는 방법을 이해하는 데 집중해야 합니다.
SSRF 공격은 불충분한 입력 유효성 검사를 악용하여 공격자가 URL을 조작하고 요청을 의도하지 않은 대상으로 리디렉션할 수 있는 경우가 많습니다. 강력한 입력 검증 및 삭제를 구현함으로써 개발자는 SSRF 공격의 위험을 크게 줄일 수 있습니다.
취약한 Go 애플리케이션에서는 테넌트 ID와 파일 ID가 유효성 검사 없이 쿼리 문자열에서 추출됩니다. 이러한 검증 부족으로 인해 SSRF 공격이 발생할 가능성이 높아졌습니다.
이러한 매개변수가 사용하기에 안전한지 확인하기 위해 입력 유효성 검사를 구현하는 다음 Go 코드를 고려해 보겠습니다.
func isValidTenantID(tenantID string) bool { // Implement a regex pattern to validate tenantID format // Example: only allow alphanumeric characters validTenantIDPattern := `^[a-zA-Z0-9]+$` matched, _ := regexp.MatchString(validTenantIDPattern, tenantID) return matched } func isValidFileID(fileID string) bool { // Implement a regex pattern to validate fileID format // Example: only allow alphanumeric characters and hyphens validFileIDPattern := `^[a-zA-Z0-9-]+$` matched, _ := regexp.MatchString(validFileIDPattern, fileID) return matched }
SSRF 취약점을 완화하는 또 다른 효과적인 전략은 아웃바운드 요청을 신뢰할 수 있는 호스트로 제한하는 것입니다. 이는 허용된 호스트의 화이트리스트를 유지하고 각 요청의 대상 호스트가 이 목록에 있는지 확인함으로써 달성할 수 있습니다.
다음은 downloadAndResize 함수에서 호스트 제한을 구현하는 방법에 대한 예입니다.
func isTrustedHost(host string) bool { // Define a list of trusted hosts trustedHosts := []string{"localtest.me", "example.com"} for _, trustedHost := range trustedHosts { if host == trustedHost { return true } } return false } func downloadAndResize(tenantID, fileID, fileSize string) error { urlStr := fmt.Sprintf("http://%s.%s/storage/%s.json", tenantID, baseHost, fileID) parsedURL, err := url.Parse(urlStr) if err != nil { panic(err) } if !isTrustedHost(parsedURL.Hostname()) { return fmt.Errorf("untrusted host: %s", parsedURL.Hostname()) } // Proceed with the rest of the function // ... }
허용된 호스트 제한을 보안 제어로 구현함으로써 Go 애플리케이션이 사전 정의되고 신뢰할 수 있는 호스트의 비공개 목록에만 HTTP 요청을 보내도록 보장하여 SSRF 공격의 영향을 더욱 줄입니다.
보안 우선 사고방식을 채택하는 것은 개발자가 강력하고 안전한 애플리케이션을 구축하는 데 매우 중요하며 Go도 다르지 않습니다. 여기에는 설계부터 배포까지 소프트웨어 개발 수명주기의 모든 단계에 보안 고려 사항을 통합하는 것이 포함됩니다.
보안을 우선시함으로써 개발자는 다음을 수행할 수 있습니다.
이 모범 사례를 따르고 Go 보안 치트시트와 같은 리소스를 활용함으로써 개발자는 Go 애플리케이션의 보안을 강화하고 SSRF와 같은 위협으로부터 보호할 수 있습니다.
SSRF 취약성으로부터 보호하는 방법과 개발자가 사용자 입력을 검증 및 삭제하고, 아웃바운드 요청을 신뢰할 수 있는 호스트로 제한하고, 허용 목록을 사용하여 액세스할 수 있는 도메인을 제어해야 하는 이유를 배웠습니다. 또한 Snyk Code와 같은 보안 도구를 활용하면 개발 프로세스 초기에 이러한 취약점을 식별하고 수정하는 데 도움이 될 수 있습니다.
애플리케이션의 보안을 더욱 강화하려면 정적 분석에 Snyk Code를 사용하는 것을 고려해 보세요. Snyk Code는 배포 전에 Go 코드의 SSRF 취약성 및 기타 보안 문제를 식별할 수 있습니다. Snyk를 IDE 또는 저장소에 통합하면 취약점을 조기에 발견하고 애플리케이션의 보안을 유지할 수 있습니다.
더 많은 Go 보안 모범 사례를 보려면 Go 보안 치트시트를 확인하고 Docker를 사용하여 애플리케이션을 안전하게 컨테이너화하는 방법을 알아보세요.
이러한 기술을 구현하고 Snyk와 같은 도구를 활용하면 SSRF 공격 및 기타 보안 위협으로부터 Go 애플리케이션을 보호할 수 있습니다.
Snyk는 광범위한 프로그래밍 언어를 지원하는 다목적 도구이므로 다양한 기술 스택에서 작업하는 개발자에게 필수적인 자산입니다. JavaScript, Python, Java, Ruby, PHP 또는 기타 언어로 개발하든 Snyk는 각 생태계에 맞는 포괄적인 보안 솔루션을 제공합니다.
여기에는 다음이 포함됩니다.
PHP: Snyk는 Composer를 지원하므로 PHP 개발자는 종속성의 취약점을 식별하여 프로젝트를 보호할 수 있습니다.
위 내용은 Go에서 SSRF 취약점을 완화하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!