Rumah > hujung hadapan web > tutorial js > Melindungi Aplikasi Node.js Anda: Panduan Komprehensif

Melindungi Aplikasi Node.js Anda: Panduan Komprehensif

Patricia Arquette
Lepaskan: 2024-12-08 14:27:10
asal
352 orang telah melayarinya

Securing Your Node.js Application: A Comprehensive Guide

Dalam landskap digital hari ini, melindungi aplikasi Node.js anda adalah yang terpenting. Daripada pemimpin global seperti Netflix dan Uber, kepada syarikat baru yang membina perkara besar seterusnya, Node.js menguasai beberapa aplikasi yang paling menuntut dan berprestasi tinggi. Walau bagaimanapun, kelemahan dalam aplikasi anda boleh membawa kepada akses tanpa kebenaran, pelanggaran data dan kehilangan kepercayaan pengguna.

Panduan ini menggabungkan amalan keselamatan praktikal dengan konsep utama daripada Panduan Pengujian Keselamatan Web OWASP (WSTG) untuk membantu anda mengukuhkan aplikasi Node.js anda. Sama ada anda mengurus operasi masa nyata atau menskalakan kepada berjuta-juta pengguna, sumber komprehensif ini akan memastikan aplikasi anda kekal selamat, boleh dipercayai dan berdaya tahan.


Pengumpulan Maklumat (WSTG-INFO)

Pengumpulan Maklumat selalunya merupakan langkah pertama yang diambil oleh penyerang untuk mengetahui lebih lanjut tentang aplikasi anda. Lebih banyak maklumat yang mereka boleh kumpulkan, lebih mudah bagi mereka untuk mengenal pasti dan mengeksploitasi kelemahan.

Konfigurasi Pelayan Express.js dan Cap Jari Biasa

Secara lalai, Express.js termasuk tetapan yang secara tidak sengaja boleh mendedahkan maklumat tentang pelayan anda. Contoh biasa ialah pengepala HTTP X-Powered-By, yang menunjukkan bahawa aplikasi anda menggunakan Express.

Contoh Kod Rentan:

const express = require('express');
const app = express();

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam persediaan ini, setiap respons HTTP termasuk pengepala X-Powered-By: Express.

Isu:

  • Citak jari: Penyerang boleh menggunakan pengepala ini untuk menentukan teknologi yang anda gunakan. Mengetahui anda menjalankan Express membolehkan mereka menyesuaikan serangan kepada kelemahan yang diketahui dalam versi Express atau Node.js tertentu.

Mitigasi:

Lumpuhkan pengepala ini untuk menyukarkan penyerang cap jari pelayan anda.

Kod Diperbaik:

const express = require('express');
const app = express();

// Disable the X-Powered-By header
app.disable('x-powered-by');

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Tebatan Dipertingkatkan dengan Topi Keledar:

Pendekatan yang lebih baik ialah menggunakan perisian tengah topi keledar, yang menetapkan pelbagai pengepala HTTP untuk meningkatkan keselamatan apl anda.

const express = require('express');
const helmet = require('helmet');
const app = express();

// Use Helmet to secure headers
app.use(helmet());

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Kenapa Gunakan Topi Keledar?

  • Pengepala Keselamatan Komprehensif: Topi keledar menetapkan berbilang pengepala HTTP yang membantu melindungi apl anda daripada kelemahan web yang terkenal.
  • Kemudahan Penggunaan: Dengan hanya satu baris, anda meningkatkan postur keselamatan aplikasi anda dengan ketara.

Ujian Pengurusan Konfigurasi dan Penerapan (WSTG-CONF)

Pengurusan konfigurasi dan penggunaan ialah aspek kritikal keselamatan aplikasi. Salah konfigurasi boleh berfungsi sebagai pintu terbuka untuk penyerang.

Berjalan dalam Mod Pembangunan dalam Pengeluaran

Menjalankan aplikasi anda dalam mod pembangunan pada pelayan pengeluaran boleh mendedahkan mesej ralat terperinci dan surih tindanan.

Contoh Kod Rentan:

const express = require('express');
const app = express();

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Dalam persediaan ini, mesej ralat terperinci dihantar kepada pelanggan.

Isu:

  • Kebocoran Maklumat: Mesej ralat terperinci dan jejak tindanan boleh mendedahkan maklumat sensitif tentang struktur, kebergantungan dan laluan fail aplikasi anda.
  • Memudahkan Eksploitasi: Penyerang boleh menggunakan maklumat ini untuk mengenal pasti potensi kelemahan dan membuat serangan yang disasarkan.

Mitigasi:

Tetapkan NODE_ENV kepada 'pengeluaran' dan gunakan mesej ralat generik dalam pengeluaran.

Kod Diperbaik:

const express = require('express');
const app = express();

// Disable the X-Powered-By header
app.disable('x-powered-by');

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Amalan Terbaik:

  • Tetapkan Pembolehubah Persekitaran Dengan Betul: Pastikan NODE_ENV ditetapkan kepada 'pengeluaran' dalam persekitaran pengeluaran anda.
  • Pengelogan Dalaman: Log ralat secara dalaman untuk tujuan penyahpepijatan tanpa mendedahkan butiran kepada pengguna akhir.

Menggunakan Bukti Kelayakan Lalai atau Lemah

Menggunakan bukti kelayakan lalai atau lemah, seperti kunci rahsia ringkas untuk menandatangani JSON Web Token (JWT), ialah kesilapan keselamatan yang biasa.

Contoh Kod Rentan:

const express = require('express');
const helmet = require('helmet');
const app = express();

// Use Helmet to secure headers
app.use(helmet());

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Kunci Rahsia Lemah: Menggunakan rentetan ringkas atau biasa seperti 'rahsia' memudahkan penyerang meneka atau memaksa kunci itu.
  • Rahsia Berkod Keras: Menyimpan rahsia terus dalam kod anda meningkatkan risiko pendedahan jika pangkalan kod anda terjejas.
  • Pemalsuan Token: Penyerang yang mengetahui kunci rahsia anda boleh memalsukan JWT yang sah, mendapat akses tanpa kebenaran.

Mitigasi:

Gunakan kunci rahsia yang kukuh dan selamat dan simpannya dengan selamat.

Kod Diperbaik:

// app.js
const express = require('express');
const app = express();

// Error handling middleware
app.use((err, req, res, next) => {
  res.status(500).send(err.stack); // Sends stack trace to the client
});

// Your routes here

app.listen(3000);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Amalan Terbaik:

  • Pembolehubah Persekitaran: Jangan rahsiakan kawalan versi. Gunakan pembolehubah persekitaran atau fail konfigurasi yang tidak disemak ke dalam kawalan sumber.
  • Putar Rahsia: Laksanakan proses untuk memutar rahsia secara berkala.
  • Sahkan Konfigurasi: Pastikan semua pembolehubah persekitaran yang diperlukan ditetapkan semasa aplikasi dimulakan.

Ujian Pengurusan Identiti (WSTG-IDNT)

Pengurusan identiti adalah penting untuk melindungi akaun pengguna dan menghalang akses tanpa kebenaran.

Dasar Nama Pengguna yang Lemah dan Penghitungan Akaun

Membenarkan nama pengguna yang lemah dan menyediakan mesej ralat tertentu boleh membawa kepada serangan penghitungan akaun.

Contoh Kod Rentan:

const express = require('express');
const app = express();

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Nama Pengguna Lemah: Membenarkan nama pengguna yang pendek atau ringkas meningkatkan risiko pencerobohan akaun.
  • Penghitungan Akaun: Mesej ralat khusus boleh membantu penyerang menentukan nama pengguna yang sah.

Mitigasi:

Laksanakan pengesahan nama pengguna dan gunakan mesej ralat generik.

Kod Diperbaik:

const express = require('express');
const app = express();

// Disable the X-Powered-By header
app.disable('x-powered-by');

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Pengesahan Nama Pengguna: Memastikan nama pengguna memenuhi kriteria tertentu, mengurangkan entri yang lemah.
  • Mesej Ralat Generik: Halang penyerang daripada mengenal pasti nama pengguna yang sah melalui respons ralat.

Ujian Pengesahan (WSTG-ATHN)

Mekanisme

Pengesahan adalah penting untuk mengesahkan identiti pengguna dan menghalang akses tanpa kebenaran.

Serangan Brute-Force pada Kata Laluan dan 2FA

Kekurangan perlindungan membolehkan penyerang meneka kata laluan atau kod 2FA melalui percubaan berulang.

Contoh Kod Rentan:

const express = require('express');
const helmet = require('helmet');
const app = express();

// Use Helmet to secure headers
app.use(helmet());

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Percubaan Log Masuk Tanpa Had: Penyerang boleh berulang kali mencuba kata laluan yang berbeza atau kod 2FA.
  • Pelaksanaan 2FA yang lemah: Kod 2FA statik atau boleh diramal terdedah.

Mitigasi:

Laksanakan pengehadan kadar dan tingkatkan keselamatan 2FA.

Kod Diperbaik:

// app.js
const express = require('express');
const app = express();

// Error handling middleware
app.use((err, req, res, next) => {
  res.status(500).send(err.stack); // Sends stack trace to the client
});

// Your routes here

app.listen(3000);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Langkah Tambahan:

  • Gunakan CAPTCHA Selepas Percubaan Gagal: Perkenalkan CAPTCHA selepas beberapa percubaan log masuk gagal untuk mengesahkan pengguna manusia.
  • Gunakan TOTP untuk 2FA: Gunakan kata laluan satu masa berasaskan masa untuk kod 2FA yang dinamik dan selamat.

Penjelasan:

  • Penghadan Kadar: Mengurangkan risiko serangan automatik dengan mengehadkan percubaan log masuk.
  • 2FA Dipertingkat: Kod berasaskan masa meningkatkan keselamatan berbanding kod statik.

Ujian Kebenaran (WSTG-ATHZ)

Keizinan memastikan pengguna mengakses sumber yang dibenarkan untuk digunakan sahaja, menghalang tindakan yang tidak dibenarkan.

Rujukan Objek Langsung Tidak Selamat (IDOR)

Pengguna boleh mengakses sumber yang tidak dibenarkan dengan memanipulasi pengecam dalam permintaan.

Contoh Kod Rentan:

// app.js
const express = require('express');
const app = express();

// Your routes here

// Error handling middleware
if (app.get('env') === 'production') {
  // Production error handler
  app.use((err, req, res, next) => {
    // Log the error internally
    console.error(err);
    res.status(500).send('An unexpected error occurred.');
  });
} else {
  // Development error handler (with stack trace)
  app.use((err, req, res, next) => {
    res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}
`); }); } app.listen(3000);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Akses Tanpa Kebenaran: Pengguna boleh mengakses data yang tidak sepatutnya dengan mengubah suai parameter orderId.

Mitigasi:

Sahkan pemilikan sumber sebelum memberikan akses.

Kod Diperbaik:

const express = require('express');
const app = express();

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Pengesahan Pemilikan: Memastikan sumber yang diminta adalah milik pengguna yang disahkan.
  • Kawalan Akses: Menghalang pengguna daripada mengakses data orang lain dengan memanipulasi parameter permintaan.

Ujian Pengurusan Sesi (WSTG-SESS)

Pengurusan sesi adalah penting untuk mengekalkan keadaan pengguna dan memastikan interaksi yang selamat.

Token Tanpa Masa Luput

Token yang tidak pernah luput menimbulkan risiko keselamatan jika ia dikompromi.

Contoh Kod Rentan:

const express = require('express');
const app = express();

// Disable the X-Powered-By header
app.disable('x-powered-by');

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Token Berterusan: Token tanpa tamat tempoh kekal sah selama-lamanya, meningkatkan peluang untuk penyalahgunaan.

Mitigasi:

Tetapkan masa tamat tempoh pada token.

Kod Diperbaik:

const express = require('express');
const helmet = require('helmet');
const app = express();

// Use Helmet to secure headers
app.use(helmet());

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Tamat Tempoh Token: Hadkan tempoh sah, mengurangkan risiko jika token dikompromi.
  • Amalan Terbaik Keselamatan: Pembaharuan token yang kerap meningkatkan keselamatan keseluruhan.

Storan Token Tidak Selamat

Menyimpan token dalam localStorage mendedahkannya kepada serangan skrip merentas tapak (XSS).

Contoh Kod Rentan:

// app.js
const express = require('express');
const app = express();

// Error handling middleware
app.use((err, req, res, next) => {
  res.status(500).send(err.stack); // Sends stack trace to the client
});

// Your routes here

app.listen(3000);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Pendedahan Sebelah Pelanggan: Skrip hasad boleh mengakses localStorage, mencuri token dan sesi rampasan.

Mitigasi:

Gunakan kuki HTTP sahaja untuk menyimpan token dengan selamat.

Kod Diperbaik:

// app.js
const express = require('express');
const app = express();

// Your routes here

// Error handling middleware
if (app.get('env') === 'production') {
  // Production error handler
  app.use((err, req, res, next) => {
    // Log the error internally
    console.error(err);
    res.status(500).send('An unexpected error occurred.');
  });
} else {
  // Development error handler (with stack trace)
  app.use((err, req, res, next) => {
    res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}
`); }); } app.listen(3000);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Kuki HTTP sahaja: Tidak boleh diakses oleh JavaScript, mengurangkan risiko XSS.
  • Bendera Selamat dan SameSite: Tingkatkan perlindungan terhadap serangan pemalsuan permintaan man-in-the-middle dan merentas tapak.

Ujian Pengesahan Input (WSTG-INPV)

Pengesahan input memastikan data yang diberikan pengguna selamat dan dijangka, menghalang serangan suntikan.

Kurang Pengesahan Input

Menerima dan memproses input pengguna tanpa pengesahan boleh membawa kepada kelemahan.

Contoh Kod Rentan:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

// Weak secret key
const SECRET_KEY = 'secret';

app.post('/login', (req, res) => {
  // Authenticate user (authentication logic not shown)
  const userId = req.body.userId;

  // Sign the JWT with a weak secret
  const token = jwt.sign({ userId }, SECRET_KEY);
  res.json({ token });
});

app.get('/protected', (req, res) => {
  const token = req.headers['authorization'];

  try {
    // Verify the token using the weak secret
    const decoded = jwt.verify(token, SECRET_KEY);
    res.send('Access granted to protected data');
  } catch (err) {
    res.status(401).send('Unauthorized');
  }
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Serangan Suntikan: Input yang tidak sah boleh membawa kepada suntikan SQL, suntikan NoSQL atau serangan suntikan kod lain.

Mitigasi:

Sahkan dan bersihkan semua input pengguna.

Kod Diperbaik:

const express = require('express');
const app = express();

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Pengesahan Input: Menyemak sama ada input memenuhi kriteria yang dijangkakan.
  • Pembersih Input: Mengalih keluar atau melepaskan watak yang berpotensi berbahaya.
  • Pertanyaan Pangkalan Data Selamat: Menggunakan pertanyaan berparameter menghalang serangan suntikan.

Ujian untuk Pengendalian Ralat (WSTG-ERRH)

Pengendalian ralat yang betul mengelakkan daripada mendedahkan maklumat sensitif dan meningkatkan pengalaman pengguna.

Mendedahkan Maklumat Ralat Sensitif

Mesej ralat terperinci boleh mendedahkan dalaman sistem kepada penyerang.

Contoh Kod Rentan:

const express = require('express');
const app = express();

// Disable the X-Powered-By header
app.disable('x-powered-by');

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Pendedahan Maklumat: Penyerang boleh mendapatkan cerapan tentang struktur aplikasi anda dan potensi kelemahan.

Mitigasi:

Gunakan mesej ralat generik dan log ralat terperinci secara dalaman.

Kod Diperbaik:

const express = require('express');
const helmet = require('helmet');
const app = express();

// Use Helmet to secure headers
app.use(helmet());

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Pengelogan Dalaman: Memastikan maklumat ralat terperinci selamat.
  • Mesej Mesra Pengguna: Menyediakan mesej generik tanpa mendedahkan butiran sensitif.

Menguji Kriptografi Lemah (WSTG-CRYP)

Kriptografi melindungi data sensitif; menggunakan amalan kriptografi yang lemah menjejaskan keselamatan.

Menggunakan Algoritma Hashing Tidak Selamat

Mencincang kata laluan dengan algoritma lapuk adalah tidak selamat.

Contoh Kod Rentan:

// app.js
const express = require('express');
const app = express();

// Error handling middleware
app.use((err, req, res, next) => {
  res.status(500).send(err.stack); // Sends stack trace to the client
});

// Your routes here

app.listen(3000);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Pencincangan Lemah: Algoritma seperti MD5 dan SHA-1 terdedah kepada serangan perlanggaran dan tidak boleh digunakan untuk pencincangan kata laluan.

Mitigasi:

Gunakan algoritma pencincangan yang kuat direka bentuk untuk kata laluan.

Kod Diperbaik:

// app.js
const express = require('express');
const app = express();

// Your routes here

// Error handling middleware
if (app.get('env') === 'production') {
  // Production error handler
  app.use((err, req, res, next) => {
    // Log the error internally
    console.error(err);
    res.status(500).send('An unexpected error occurred.');
  });
} else {
  // Development error handler (with stack trace)
  app.use((err, req, res, next) => {
    res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}
`); }); } app.listen(3000);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Bcrypt: Fungsi pencincangan teguh yang menggabungkan pemasinan dan berbilang pusingan pencincangan.
  • Keselamatan Kata Laluan: Menjadikan penyerang tidak boleh membuat pengiraan kata laluan kejuruteraan balik.

Kunci Rahsia Pengekodan Keras

Menyimpan rahsia secara langsung dalam kod meningkatkan risiko pendedahan.

Contoh Kod Rentan:

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

// Weak secret key
const SECRET_KEY = 'secret';

app.post('/login', (req, res) => {
  // Authenticate user (authentication logic not shown)
  const userId = req.body.userId;

  // Sign the JWT with a weak secret
  const token = jwt.sign({ userId }, SECRET_KEY);
  res.json({ token });
});

app.get('/protected', (req, res) => {
  const token = req.headers['authorization'];

  try {
    // Verify the token using the weak secret
    const decoded = jwt.verify(token, SECRET_KEY);
    res.send('Access granted to protected data');
  } catch (err) {
    res.status(401).send('Unauthorized');
  }
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Pendedahan Rahsia: Jika pangkalan kod terjejas, rahsia kod keras boleh diekstrak dengan mudah.

Mitigasi:

Simpan rahsia dalam pembolehubah persekitaran atau fail konfigurasi selamat.

Kod Diperbaik:

const express = require('express');
const app = express();

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Pembolehubah Persekitaran: Simpan rahsia daripada pangkalan kod dan sistem kawalan versi.
  • Amalan Keselamatan: Mengurangkan risiko pendedahan tidak sengaja.

Ujian Logik Perniagaan (WSTG-BUSL)

Logik perniagaan kerentanan berlaku apabila aliran aplikasi boleh dimanipulasi dengan cara yang tidak diingini.

Penyalahgunaan Operasi Pukal

Operasi data tanpa had boleh membawa kepada isu prestasi atau kebocoran data.

Contoh Kod Rentan:

const express = require('express');
const app = express();

// Disable the X-Powered-By header
app.disable('x-powered-by');

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Penolakan Perkhidmatan (DoS): Eksport data yang besar boleh menghabiskan sumber pelayan.
  • Kebocoran Data: Akses tanpa had boleh mendedahkan maklumat sensitif.

Mitigasi:

Laksanakan penomboran dan kawalan akses.

Kod Diperbaik:

const express = require('express');
const helmet = require('helmet');
const app = express();

// Use Helmet to secure headers
app.use(helmet());

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Penomboran: Mengawal jumlah data yang dikembalikan, mengelakkan keletihan sumber.
  • Kawalan Akses: Memastikan pengguna hanya boleh mengakses data mereka sendiri.

Ujian Bahagian Pelanggan (WSTG-CLNT)

Melindungi daripada kelemahan pihak pelanggan adalah penting untuk melindungi pengguna daripada serangan seperti Skrip Silang Tapak (XSS).

Melepaskan Input Pengguna Menggunakan Perpustakaan xss

Pengendalian input pengguna yang tidak betul dalam skrip sebelah klien boleh menyebabkan serangan XSS.

Contoh Kod Rentan:

// app.js
const express = require('express');
const app = express();

// Error handling middleware
app.use((err, req, res, next) => {
  res.status(500).send(err.stack); // Sends stack trace to the client
});

// Your routes here

app.listen(3000);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Manipulasi DOM yang tidak selamat: Memasukkan input pengguna yang tidak bersih ke dalam innerHTML membolehkan pelaksanaan skrip berniat jahat.

Mitigasi:

Gunakan perpustakaan xss untuk membersihkan input pengguna sebelum membuat persembahan.

Kod Diperbaik:

// app.js
const express = require('express');
const app = express();

// Your routes here

// Error handling middleware
if (app.get('env') === 'production') {
  // Production error handler
  app.use((err, req, res, next) => {
    // Log the error internally
    console.error(err);
    res.status(500).send('An unexpected error occurred.');
  });
} else {
  // Development error handler (with stack trace)
  app.use((err, req, res, next) => {
    res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}
`); }); } app.listen(3000);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Pembersih Input: Pustaka xss membersihkan input dengan melarikan diri atau mengalih keluar kandungan yang berpotensi berbahaya.
  • Mencegah Perlaksanaan Skrip: Meneutralkan skrip berniat jahat, menghalangnya daripada melaksanakan dalam penyemak imbas.

Amalan Terbaik:

  • Gunakan textContent Apabila Mungkin: Menugaskan input pengguna kepada textContent menganggapnya sebagai teks biasa.
const express = require('express');
const app = express();

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
  • Gabungkan Pengesahan Bahagian Klien dan Pelayan: Pendekatan pertahanan yang mendalam meningkatkan keselamatan.

Ujian API (WSTG-APIT)

Melindungi titik akhir API adalah penting untuk mengelakkan kebocoran data dan akses tanpa kebenaran.

Pendedahan Introspeksi GrafikQL

Membiarkan introspeksi GraphQL didayakan dalam pengeluaran mendedahkan skema API anda.

Contoh Kod Rentan:

const express = require('express');
const app = express();

// Disable the X-Powered-By header
app.disable('x-powered-by');

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Pendedahan Skema: Penyerang boleh meneroka skema API anda, membantu dalam mencipta serangan yang disasarkan.

Mitigasi:

Lumpuhkan introspeksi dalam persekitaran pengeluaran.

Kod Diperbaik:

const express = require('express');
const helmet = require('helmet');
const app = express();

// Use Helmet to secure headers
app.use(helmet());

// Your routes here

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Introspeksi Bersyarat: Membenarkan introspeksi semasa pembangunan tetapi melumpuhkannya dalam pengeluaran.
  • Peningkatan Keselamatan: Mengurangkan permukaan serangan dengan menyembunyikan butiran skema.

Kerumitan Pertanyaan Tanpa Sekatan

Pertanyaan yang sangat bersarang atau rumit boleh menghabiskan sumber pelayan.

Contoh Kod Rentan:

// app.js
const express = require('express');
const app = express();

// Error handling middleware
app.use((err, req, res, next) => {
  res.status(500).send(err.stack); // Sends stack trace to the client
});

// Your routes here

app.listen(3000);

Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Isu:

  • Penolakan Perkhidmatan (DoS): Pertanyaan rumit boleh membawa kepada penggunaan CPU dan memori yang tinggi.

Mitigasi:

Hadkan kedalaman dan kerumitan pertanyaan.

Kod Diperbaik:

// app.js
const express = require('express');
const app = express();

// Your routes here

// Error handling middleware
if (app.get('env') === 'production') {
  // Production error handler
  app.use((err, req, res, next) => {
    // Log the error internally
    console.error(err);
    res.status(500).send('An unexpected error occurred.');
  });
} else {
  // Development error handler (with stack trace)
  app.use((err, req, res, next) => {
    res.status(500).send(`<pre class="brush:php;toolbar:false">${err.stack}
`); }); } app.listen(3000);
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk

Penjelasan:

  • Penghadan Kedalaman: Mengehadkan kedalaman pertanyaan untuk mengelakkan keletihan sumber.
  • Perlindungan Prestasi: Memastikan API kekal responsif dan tersedia.

Kesimpulan

Melindungi aplikasi Node.js anda melibatkan pendekatan berbilang lapisan:

  • Cegah Kebocoran Maklumat: Bersihkan kod dan konfigurasi pelayan untuk mengelak daripada mendedahkan data sensitif.
  • Urus Konfigurasi Dengan Selamat: Alih keluar bukti kelayakan lalai dan fail konfigurasi selamat.
  • Sahkan dan Bersihkan Input: Jangan sekali-kali mempercayai input pengguna.
  • Melaksanakan Pengesahan dan Keizinan yang Betul: Pastikan pengguna mempunyai akses yang sesuai.
  • Gunakan Kriptografi Kuat: Lindungi data dengan algoritma selamat dan pengurusan kunci.
  • Kendalikan Ralat Dengan Anggun: Elakkan mendedahkan maklumat sensitif.
  • Lindungi Interaksi Pihak Klien: Kurangkan XSS dan serangan berasaskan pelayar lain.
  • API Selamat: Kawal pendedahan data dan kuatkuasakan pengehadan kadar.

Dengan menyepadukan amalan ini, anda meningkatkan keselamatan aplikasi anda, melindungi data pengguna dan mengekalkan kepercayaan.


Bacaan Selanjutnya

  • Panduan Pengujian Keselamatan Web OWASP (WSTG): OWASP WSTG
  • Panduan Keselamatan Node.js: Keselamatan Node.js
  • Petua Keselamatan Express.js: Amalan Terbaik Keselamatan Ekspres
  • Amalan Terbaik Keselamatan GraphQL: Keselamatan Apollo GraphQL
  • Sepuluh Teratas OWASP: Sepuluh Teratas OWASP
  • Dokumen Web MDN - Keselamatan Web: Keselamatan Web MDN

Nota: Panduan ini menyediakan cadangan umum. Untuk kebimbangan keselamatan khusus, rujuk profesional.

Atas ialah kandungan terperinci Melindungi Aplikasi Node.js Anda: Panduan Komprehensif. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
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