Menjaga permintaan HTTP adalah penting apabila membangunkan aplikasi Go untuk mengelakkan kelemahan seperti Pemalsuan Permintaan Sisi Pelayan (SSRF). SSRF berlaku apabila penyerang memanipulasi pelayan untuk membuat permintaan yang tidak diingini, berpotensi mengakses perkhidmatan dalaman atau data sensitif.
Kami akan meneroka cara untuk melindungi permintaan HTTP dengan menggunakan teknik penghuraian dan pengesahan URL, serta menyediakan kod contoh untuk menguatkan pengendali permintaan http.Get HTTP GET.
Kod pengendali laluan HTTP yang menghantar permintaan HTTP ke domain pengguna sendiri untuk mengambil imej adalah seperti berikut (dikurangkan untuk ringkas) dalam fungsi yang dipanggil muat turunAndResize:
func downloadAndResize(tenantID, fileID, fileSize string) error { // ... downloadResp, err := http.Get(info.Download) if (err != nil) { panic(err) } // ... }
Untuk mengurangkan kerentanan SSRF dalam aplikasi Go, pembangun harus menumpukan pada mengesahkan dan membersihkan input serta memahami cara membina URL dengan selamat dengan cara yang tidak memanipulasi domain yang terhasil.
Serangan SSRF selalunya mengeksploitasi pengesahan input yang tidak mencukupi, membenarkan penyerang memanipulasi URL dan mengubah hala permintaan ke destinasi yang tidak diingini. Dengan melaksanakan pengesahan input dan sanitasi yang mantap, pembangun boleh mengurangkan risiko serangan SSRF dengan ketara.
Dalam aplikasi Go kami yang terdedah, tenantID dan ID fail diekstrak daripada rentetan pertanyaan tanpa sebarang pengesahan. Kekurangan pengesahan ini membuka pintu untuk serangan SSRF.
Mari pertimbangkan kod Go berikut yang melaksanakan pengesahan input untuk memastikan parameter ini selamat digunakan:
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 }
Satu lagi strategi berkesan untuk mengurangkan kerentanan SSRF ialah mengehadkan permintaan keluar kepada hos yang dipercayai. Ini boleh dicapai dengan mengekalkan senarai putih hos yang dibenarkan dan mengesahkan bahawa hos destinasi setiap permintaan ada dalam senarai ini.
Berikut ialah contoh cara anda boleh melaksanakan sekatan hos dalam fungsi muat turunAndResize:
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 // ... }
Dengan melaksanakan sekatan hos yang dibenarkan sebagai kawalan keselamatan, kami memastikan bahawa aplikasi Go hanya menghantar permintaan HTTP ke senarai tertutup hos yang dipratentukan dan dipercayai, seterusnya mengurangkan kesan serangan SSRF.
Mengguna pakai minda mengutamakan keselamatan adalah penting untuk pembangun membina aplikasi yang mantap dan selamat, dan Go juga tidak berbeza. Ini melibatkan penyepaduan pertimbangan keselamatan ke dalam setiap peringkat kitaran hayat pembangunan perisian, daripada reka bentuk kepada penggunaan.
Dengan mengutamakan keselamatan, pembangun boleh:
Dengan mengikuti amalan terbaik ini dan memanfaatkan sumber seperti helaian tipu keselamatan Go, pembangun boleh meningkatkan keselamatan aplikasi Go mereka dan melindungi daripada ancaman seperti SSRF.
Kami mempelajari cara melindungi daripada kerentanan SSRF dan sebab pembangun harus mengesahkan dan membersihkan input pengguna, mengehadkan permintaan keluar kepada hos yang dipercayai dan menggunakan senarai dibenarkan untuk mengawal domain yang boleh diakses. Selain itu, memanfaatkan alatan keselamatan seperti Snyk Code boleh membantu mengenal pasti dan membetulkan kelemahan tersebut pada awal proses pembangunan.
Untuk meningkatkan lagi keselamatan aplikasi anda, pertimbangkan untuk menggunakan Kod Snyk untuk analisis statik. Kod Snyk boleh mengenal pasti kelemahan SSRF dan isu keselamatan lain dalam kod Go anda sebelum penggunaan. Dengan menyepadukan Snyk ke dalam IDE atau repositori anda, anda boleh menangkap kelemahan lebih awal dan memastikan aplikasi anda kekal selamat.
Untuk lebih banyak amalan terbaik keselamatan Go, lihat helaian tipu keselamatan Go dan ketahui cara menyimpan aplikasi anda dengan selamat dengan Docker.
Dengan melaksanakan teknik ini dan menggunakan alatan seperti Snyk, anda boleh melindungi aplikasi Go anda daripada serangan SSRF dan ancaman keselamatan lain.
Snyk ialah alat serba boleh yang menyokong pelbagai bahasa pengaturcaraan, menjadikannya aset penting untuk pembangun yang bekerja dalam susunan teknologi yang pelbagai. Sama ada membangun dalam JavaScript, Python, Java, Ruby, PHP atau bahasa lain, Snyk menyediakan penyelesaian keselamatan komprehensif yang disesuaikan dengan setiap ekosistem.
Ini termasuk:
PHP: Snyk menyokong Komposer, membolehkan pembangun PHP melindungi projek mereka dengan mengenal pasti kelemahan dalam kebergantungan mereka.
Atas ialah kandungan terperinci Bagaimana untuk mengurangkan kelemahan SSRF dalam Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!