Rumah >hujung hadapan web >tutorial js >Menjaga Laluan Fail: Mencegah Serangan Traversal Direktori
Pengendalian laluan fail yang tidak betul boleh membawa kepada kelemahan keselamatan yang dikenali sebagai serangan traversal direktori. Kerentanan ini membenarkan penyerang mengakses fail sewenang-wenangnya pada pelayan.
Serangan traversal direktori berlaku apabila penyerang memanipulasi laluan fail untuk mengakses fail di luar direktori yang dimaksudkan. Contohnya, jika aplikasi menggunakan laluan fail yang disediakan pengguna tanpa pengesahan, penyerang boleh menggunakan laluan seperti ../../etc/passwd untuk mengakses fail sensitif pada pelayan.
const filePath = `public/uploads/${req.params.fileName}`;
Bayangkan anda mempunyai fungsi muat turun fail yang membolehkan pengguna memuat turun fail dengan menyediakan id. Aplikasi mungkin membina laluan fail terus daripada input pengguna.
/public/uploads/../../secret.txt
Di sini penyerang boleh memberikan input berniat jahat seperti ../../secret.txt, yang membawa kepada akses fail yang tidak diingini.
Jika aplikasi tidak mengesahkan input ini, ia boleh mendedahkan fail sensitif, seperti fail konfigurasi atau data pengguna, kepada penyerang.
import path from 'path'; import fs from 'fs/promises'; import { RequestHandler, NextFunction } from 'express'; // Point: 1 const BASE_DIRECTORY = path.resolve(__dirname, 'public/uploads'); export const downloadAttachment: RequestHandler = async (req, res, next: NextFunction) => { // Point: 2 const { fileName } = req.params; // Point: 3 const filePath = path.join(BASE_DIRECTORY, fileName); const resolvedPath = path.resolve(filePath); // Point: 4 if (!resolvedPath.startsWith(BASE_DIRECTORY)) { return res.status(400).json({ message: "Invalid file path" }); } try { // Point: 5 await fs.access(resolvedPath); // Point: 6 res.download(resolvedPath, path.basename(fileName), (err) => { if (err) { return next(err); } }); } catch { // Point: 7 return res.status(404).json({ message: "File not found" }); } };
Definisi Direktori Asas: Mewujudkan direktori tetap untuk muat naik fail untuk menyekat akses.
Mengekstrak Nama Fail: Mengambil semula nama fail yang diminta daripada parameter URL.
Pembinaan Laluan Fail: Menggabungkan direktori asas dengan nama fail yang diminta untuk mencipta laluan penuh.
Pengesahan Laluan: Memastikan laluan fail yang diselesaikan berada dalam direktori asas yang ditetapkan untuk menghalang akses tanpa kebenaran.
Semakan Kewujudan Fail: Asynchronously menyemak sama ada fail wujud pada laluan yang dibina.
Pengendalian Muat Turun Fail: Memulakan muat turun fail dan mengendalikan sebarang ralat yang mungkin berlaku semasa proses.
Ralat Mengendalikan Fail Hilang: Menghantar respons 404 jika fail yang diminta tidak wujud.
Pengiktirafan: Dokumen ini merujuk maklumat daripada PortSwigger Web Security dan ChatGPT.
Atas ialah kandungan terperinci Menjaga Laluan Fail: Mencegah Serangan Traversal Direktori. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!