laluan pendedahan ralat golang

WBOY
Lepaskan: 2023-05-10 09:28:06
asal
1004 orang telah melayarinya

Golang ialah bahasa pengaturcaraan yang cekap, ringkas dan selamat, tetapi ia juga mempunyai kelemahannya sendiri, iaitu ia mudah untuk mendedahkan laluan sistem apabila mengendalikan ralat. Artikel ini akan menerangkan masalah ini dan memberikan penyelesaian.

1. Latar belakang masalah

Mekanisme pengendalian ralat Golang sangat mesra pembangun. Dalam fungsi, jika anda perlu mengembalikan ralat, anda boleh terus mengembalikan pembolehubah jenis ralat. Contohnya:

func Divide(a, b int) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("cannot divide by zero")
    }
    return float64(a) / float64(b), nil
}
Salin selepas log masuk

Apabila menggunakan fungsi ini, anda hanya perlu menentukan sama ada pembolehubah ralat adalah sifar untuk menentukan sama ada ralat telah berlaku. Contohnya:

result, err := Divide(10, 2)
if err != nil {
    fmt.Println(err)
    return
}
fmt.Println(result)
Salin selepas log masuk

Kaedah pengendalian ralat ini sangat ringkas, cekap dan mudah diterima oleh semua orang. Walau bagaimanapun, maklumat tindanan ralat mengandungi maklumat laluan, yang bermaksud bahawa apabila ralat program berlaku, penyerang boleh mendapatkan maklumat sensitif seperti laluan sistem daripada maklumat ralat untuk menjalankan serangan yang lebih tepat.

2. Analisis Masalah

Mari kita lihat contoh di atas Apabila melaksanakan Divide(10, 0), mesej ralat adalah seperti berikut:

cannot divide by zero
main.Divide
    /Users/xxx/Documents/go/src/error.go:3
main.main
    /Users/xxx/Documents/go/src/main.go:10
runtime.main
    /usr/local/go/src/runtime/proc.go:204
runtime.goexit
    /usr/local/go/src/runtime/asm_amd64.s:1371
Salin selepas log masuk

Seperti yang anda lihat, kita bukan sahaja dapat melihat Pergi ke fail dan nombor baris di mana mesej ralat dan fungsi ralat terletak, dan anda juga boleh melihat kod pelaksanaan khusus fungsi ralat. Pendedahan maklumat salah jenis ini terlalu terperinci dan meningkatkan kebarangkalian penyerang untuk berjaya.

3. Penyelesaian

Sekarang masalah itu telah ditemui, kita perlu mencari penyelesaian. Seterusnya ialah dua penyelesaian yang mungkin:

  1. Jenis ralat tersuai

Di Golang, kami boleh menyesuaikan jenis ralat. Takrifannya sangat mudah, anda hanya perlu melaksanakan kaedah Ralat() antara muka ralat. Contohnya:

type MyError struct {
    Reason string
}

func (m MyError) Error() string {
    return m.Reason
}

func Divide(a, b int) (float64, error) {
    if b == 0 {
        return 0, MyError{Reason: "cannot divide by zero"}
    }
    return float64(a) / float64(b), nil
}
Salin selepas log masuk

Dengan cara ini, apabila ralat program berlaku, maklumat tindanan ralat tidak lagi mengandungi maklumat sensitif seperti laluan, tetapi hanya mengandungi maklumat ralat tersuai kami. Contohnya:

cannot divide by zero
Salin selepas log masuk
  1. Gunakan perpustakaan pihak ketiga

Selain jenis ralat tersuai, kami juga boleh menggunakan perpustakaan pihak ketiga sedia ada untuk menyelesaikan masalah ini. Perpustakaan yang biasa digunakan termasuk logrus, zerolog, dsb., yang boleh menyulitkan dan memproses maklumat ralat, dan boleh menghalang pendedahan maklumat sensitif seperti laluan sistem dengan berkesan.

Mengambil logrus sebagai contoh, kita hanya perlu menghantar pembolehubah jenis ralat sebagai parameter apabila menggunakan logrus untuk merekod log. Contohnya:

import (
    log "github.com/sirupsen/logrus"
)

func Divide(a, b int) (float64, error) {
    if b == 0 {
        return 0, fmt.Errorf("cannot divide by zero")
    }
    return float64(a) / float64(b), nil
}

func main() {
    result, err := Divide(10, 0)
    if err != nil {
        log.WithError(err).Error("divide error")
        return
    }
    log.Info(result)
}
Salin selepas log masuk

Dengan cara ini, apabila ralat program berlaku, hanya maklumat ralat akan diterima dalam log, dan tiada maklumat sensitif seperti laluan akan didedahkan.

4. Ringkasan

Artikel ini memperkenalkan isu keselamatan mekanisme pengendalian ralat Golang dan menyediakan dua penyelesaian. Menyesuaikan jenis ralat ialah penyelesaian biasa, dan menggunakan perpustakaan pihak ketiga boleh menyelesaikan masalah dengan lebih mudah dan cekap. Pembangun Golang mesti memberi perhatian sama ada maklumat sensitif mungkin terdedah dalam mesej ralat dan mengambil langkah pencegahan yang sepadan. Hanya dengan cara ini program kami boleh dibuat lebih selamat dan boleh dipercayai.

Atas ialah kandungan terperinci laluan pendedahan ralat golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan