Go アプリケーションを開発する場合、サーバーサイド リクエスト フォージェリ (SSRF) などの脆弱性を防ぐために、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 の脆弱性を軽減するためのもう 1 つの効果的な戦略は、信頼できるホストへの送信リクエストを制限することです。これは、許可されたホストのホワイトリストを維持し、各リクエストの宛先ホストがこのリストに含まれていることを確認することで実現できます。
ここでは、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 コードを使用することを検討してください。 Snyk Code は、デプロイ前に Go コード内の SSRF 脆弱性やその他のセキュリティ問題を特定できます。 Snyk を IDE またはリポジトリに統合することで、脆弱性を早期に発見し、アプリケーションの安全性を確保できます。
Go セキュリティのベスト プラクティスの詳細については、Go セキュリティ チートシートを確認し、Docker を使用してアプリケーションを安全にコンテナ化する方法を学習してください。
これらの手法を実装し、Snyk などのツールを利用することで、Go アプリケーションを SSRF 攻撃やその他のセキュリティ脅威から保護できます。
Snyk は、幅広いプログラミング言語をサポートする多用途ツールであり、さまざまな技術スタックで作業する開発者にとって不可欠な資産となっています。 JavaScript、Python、Java、Ruby、PHP、またはその他の言語で開発する場合でも、Snyk は各エコシステムに合わせた包括的なセキュリティ ソリューションを提供します。
これには以下が含まれます:
PHP: Snyk は Composer をサポートしており、PHP 開発者が依存関係の脆弱性を特定してプロジェクトを保護できるようにします。
以上がGo の SSRF 脆弱性を軽減する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。