Bagaimanakah saya boleh memudahkan dan menjamin penyahmampatan fail menggunakan pakej zip Go?

Barbara Streisand
Lepaskan: 2024-11-14 14:54:02
asal
357 orang telah melayarinya

How can I simplify and secure file decompression using Go's zip package?

Penyahmampatan Fail yang Mudah dan Berkesan dalam Go

Menyahmampatan arkib ZIP dalam Go boleh menjadi proses yang mudah. Satu pendekatan, seperti yang ditunjukkan oleh kod asal, melibatkan pengendalian penyahmampatan secara manual untuk setiap fail dalam arkib.

Walau bagaimanapun, terdapat cara yang lebih lancar dan cekap untuk mencapainya menggunakan penyelesaian yang dikemas kini berikut:

func Unzip(src, dest string) error { r, err := zip.OpenReader(src) if err != nil { return err } defer func() { if err := r.Close(); err != nil { panic(err) } }() os.MkdirAll(dest, 0755) // Closure to wrap file extraction and writing, avoiding deferred stack overflow extractAndWriteFile := func(f *zip.File) error { rc, err := f.Open() if err != nil { return err } defer func() { if err := rc.Close(); err != nil { panic(err) } }() path := filepath.Join(dest, f.Name) // Check for directory traversal (ZipSlip) vulnerability if !strings.HasPrefix(path, filepath.Clean(dest)+string(os.PathSeparator)) { return fmt.Errorf("illegal file path: %s", path) } if f.FileInfo().IsDir() { os.MkdirAll(path, f.Mode()) } else { os.MkdirAll(filepath.Dir(path), f.Mode()) f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) if err != nil { return err } defer func() { if err := f.Close(); err != nil { panic(err) } }() _, err = io.Copy(f, rc) if err != nil { return err } } return nil } for _, f := range r.File { err := extractAndWriteFile(f) if err != nil { return err } } return nil }

Pengeluaran Fail Berbalut Penutupan:
    Proses pengekstrakan dan penulisan untuk setiap fail dirangkumkan dalam penutupan, menghapuskan keperluan untuk menyusun dan membersihkan berbilang panggilan penangguhan .Tutup() untuk setiap fail.
  • Penciptaan Direktori:
  • Penyelesaian memastikan direktori destinasi wujud sebelum mengekstrak fail, mengelakkan sebarang kegagalan pengekstrakan.
  • Pencegahan ZipSlip:
  • Ia termasuk semakan keselamatan untuk menghalang kemungkinan kelemahan traversal direktori (ZipSlip) dengan mengesahkan bahawa fail tidak diekstrak di luar direktori destinasi yang dijangkakan.
  • Dengan peningkatan ini, kod ini menyediakan kaedah yang mudah, teguh dan selamat untuk menyahzip fail dalam Go.

Atas ialah kandungan terperinci Bagaimanakah saya boleh memudahkan dan menjamin penyahmampatan fail menggunakan pakej zip Go?. 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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan