Bootcamp i backendutvikling med Node.js · leksjon

Sikker koding i Node.js

Implementer beste praksis for å forebygge vanlige sårbarheter som XSS, CSRF og SQL-injeksjon i Node.js-koden din.

Leksjon 2 av 411 trinn

Sikker koding i Node.js er en gratis leksjon i Bootcamp i backendutvikling med Node.js på CoddyKit. Dette er leksjon 2 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Bootcamp i backendutvikling med Node.js, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Bootcamp i backendutvikling med Node.js inneholder totalt 4 leksjoner.

Hvorfor sikker koding er viktig

Velkommen! I denne leksjonen skal vi gå gjennom viktige prinsipper for sikker koding i Node.js. Det er like viktig å skrive sikker kode som å skrive kode som fungerer.

Ved å forstå og forhindre vanlige sårbarheter beskytter du applikasjonen og brukerne mot ondsinnede angrep.

  • Datainnbrudd: Sensitiv informasjon blir eksponert.
  • Nedetid: Angrep kan krasje applikasjonen.
  • Omdømmeskade: Tap av brukernes tillit.
Sikker koding i Node.js — illustrasjon 1

Cross-Site Scripting (XSS)

Cross-Site Scripting (XSS) er en vanlig sårbarhet i webapplikasjoner der angripere injiserer skadelige skript (vanligvis JavaScript) i nettsider som vises til andre brukere.

Når brukerens nettleser laster inn den berørte siden, kjøres det skadelige skriptet. Det kan potensielt stjele informasjonskapsler eller økt-tokens, eller endre innholdet på siden.

  • Reflektert XSS: Skriptet kjøres umiddelbart fra brukerinndata.
  • Lagret XSS: Det skadelige skriptet lagres i databasen og leveres deretter til brukerne.
  • DOM-basert XSS: Sårbarhet i klientkode som endrer DOM-en.

Forhindre XSS: Escap output

Det viktigste forsvaret mot XSS er å aldri stole på brukerinndata og alltid escape dem før de gjengis som HTML.

Det innebærer å konvertere tegn som <, >, & og " til tilsvarende HTML-entiteter (for eksempel &lt; og &gt;). På denne måten tolker nettleseren dem som tekst, ikke som kjørbar kode.

Prøv å kjøre dette eksempelet:

function escapeHtml(str) {
  return str
    .replace(/&/g, "&amp;")
    .replace(/</g, "&lt;")
    .replace(/>/g, "&gt;")
    .replace(/"/g, "&quot;")
    .replace(/'/g, "&#039;");
}

const userInput = "<h1>Hello</h1><script>alert('XSS!');</script>";
const safeOutput = escapeHtml(userInput);

console.log("Original Input:\n", userInput);
console.log("\nEscaped Output (safe for HTML):\n", safeOutput);

Forhindre XSS: CSP

Utover escaping legger en Content Security Policy (CSP) til et ekstra forsvarslag mot XSS.

CSP er en HTTP-header som forteller nettlesere hvilke dynamiske ressurser (skript, stiler og bilder) som kan lastes inn, og hvor de kan lastes fra. Den kan i betydelig grad begrense konsekvensene av XSS-angrep ved å blokkere uautorisert kjøring av skript.

Eksempel på header: Content-Security-Policy: default-src 'self'; script-src 'self' trusted.cdn.com;

SQL-injeksjon forklart

SQL Injection (SQLi) er et sikkerhetssårbarhet i nettapplikasjoner som gjør det mulig for en angriper å påvirke spørringene en applikasjon sender til databasen.

Ved å injisere skadelig SQL-kode i inndatafelt kan en angriper lure databasen til å utføre utilsiktede kommandoer, for eksempel avsløre sensitive data, endre data eller til og med slette tabeller.

Et vanlig eksempel er å endre en innloggingsspørring for å omgå autentisering uten å kjenne passordet.

Forhindre SQLi: Parametriserte spørringer

Den mest effektive måten å forhindre SQL Injection på er å bruke parametriserte spørringer (også kjent som prepared statements).

I stedet for å bygge brukerinput direkte inn i SQL-strengen bruker du plassholdere for verdiene. Databasen behandler deretter disse plassholderne som data, ikke som kjørbar SQL-kode, og hindrer dermed ondsinnet injeksjon.

ORM-er (Object-Relational Mappers), som Mongoose for MongoDB eller Sequelize for SQL-databaser, håndterer dette automatisk.

/*
  This is a conceptual example for parameterized queries.
  In a real app, you'd use a database driver or ORM (e.g., 'pg' for PostgreSQL).
*/

function executeSafeQuery(dbClient, userId) {
  // Using a placeholder (?) ensures the input is treated as data, not code.
  const query = "SELECT * FROM users WHERE id = ?";
  console.log(`Executing SQL: "${query}" with param: "${userId}"`);
  // In a real scenario, dbClient.query would execute this safely.
}

// Mock database client for demonstration purposes
const mockDbClient = {
  query: (sql, params, callback) => {
    // Simulate actual query execution logic here
    console.log("  (Mock DB: Input handled safely)");
    callback(null, [{ id: params, name: "John Doe" }]);
  }
};

const maliciousUserId = "1 OR 1=1"; // This would be dangerous if not parameterized
const safeUserId = "1";

console.log("Attempting a 'malicious' ID (will be treated as a string value): ");
executeSafeQuery(mockDbClient, maliciousUserId);

console.log("\nAttempting a safe ID: ");
executeSafeQuery(mockDbClient, safeUserId);

Cross-Site Request Forgery (CSRF)

Cross-Site Request Forgery (CSRF) er et angrep som lurer en innlogget bruker til å utføre en utilsiktet handling i en nettapplikasjon.

Se for deg at du er logget inn i nettbanken. En angriper sender deg en skadelig lenke (for eksempel i en e-post). Hvis du klikker på den, kan angriperens nettsted sende en forespørsel til banken din ved hjelp av den autentiserte økten din og tvinge deg til å overføre penger uten at du vet det.

Det avgjørende er at nettleseren automatisk sender øktinformasjonskapslene dine med forespørselen til bankens domene.

Forhindre CSRF: CSRF-tokener

For å forhindre CSRF bruker vi CSRF-tokener. Serveren genererer et unikt og uforutsigbart token for hver brukerøkt og bygger det inn i skjemaer eller headere.

Når brukeren sender inn en forespørsel, kontrollerer serveren om tokenet som ble sendt inn, samsvarer med tokenet som er lagret i brukerens økt. Hvis de ikke samsvarer, avvises forespørselen.

Ettersom en angriper ikke kan kjenne til eller forfalske dette unike tokenet for en annen bruker, kan angriperen ikke lure brukeren til å sende en gyldig forespørsel.

/*
  This is a conceptual example for CSRF token handling.
  It is not runnable as a standalone script without a web server (e.g., Express).
*/

// 1. Server generates and stores a token in the user's session:
function generateCsrfToken() {
  // In a real app, use a crypto-secure random string generator.
  return Math.random().toString(36).substring(2, 15) + Math.random().toString(36).substring(2, 15);
}

const userSession = { id: "user123", csrfToken: null };
userSession.csrfToken = generateCsrfToken();
console.log("Server generated CSRF token for user:", userSession.csrfToken);

// 2. Server embeds this token in forms sent to the client:
const formHtml = `<form action="/transfer" method="POST">
  <input type="hidden" name="_csrf" value="${userSession.csrfToken}">
  <input type="number" name="amount">
  <button type="submit">Transfer</button>
</form>`;
console.log("\nForm snippet with token (sent to client):\n", formHtml);

// 3. On submission, the server validates the token:
function validateCsrfToken(submittedToken, sessionToken) {
  return submittedToken === sessionToken;
}

const userSubmittedToken = userSession.csrfToken; // Simulate valid submission
const attackerSubmittedToken = "fake_token_from_attacker";

console.log("\nValidation results:");
console.log("  Valid submission:", validateCsrfToken(userSubmittedToken, userSession.csrfToken));
console.log("  Attacker's submission:", validateCsrfToken(attackerSubmittedToken, userSession.csrfToken));

Andre sikkerhetsh headere

I tillegg til de viktigste sårbarhetene kan flere andre HTTP-sikkerhetsh headere styrke sikkerheten i Node.js-applikasjonen din:

  • X-Content-Type-Options: nosniff: Hindrer nettlesere i å «sniffe» innholdstypen i et svar, noe som kan forhindre XSS-angrep.
  • X-Frame-Options: DENY: Hindrer at nettstedet ditt bygges inn i en <iframe> og beskytter mot clickjacking-angrep.
  • Strict-Transport-Security (HSTS): Tvinger nettlesere til å koble seg til nettstedet ditt kun ved hjelp av HTTPS, og forhindrer nedgraderingsangrep.

Disse headerne settes vanligvis ved hjelp av middleware i rammeverk som Express.js.

Kontroll av sikkerhetssårbarheter

Hvilket av følgende er det mest effektive forsvaret mot SQL Injection-angrep?

Oppsummering av sikker koding

Godt jobbet! Du har lært om viktige metoder for sikker koding i Node.js.

  • XSS: Forhindres ved å escape alt brukergenerert innhold før det gjengis som HTML, og ved å bruke CSP.
  • SQL Injection: Forhindres ved alltid å bruke parametriserte spørringer eller ORM-er.
  • CSRF: Forhindres ved å implementere CSRF-tokener for forespørsler som endrer tilstand.
  • Husk også å bruke andre sikkerhetsh headere, som X-Content-Type-Options og X-Frame-Options, for et mer robust forsvar.

Anta alltid at brukerinput er skadelig, og valider, rens og escape den på riktig måte!

Gratis å komme i gang

Lær deg JavaScript med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
22
Leksjoner
92

Ofte stilte spørsmål

Er leksjonen «Sikker koding i Node.js» gratis?

Ja – hele teksten i «Sikker koding i Node.js» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Bootcamp i backendutvikling med Node.js-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Bootcamp i backendutvikling med Node.js inneholder totalt 4 leksjoner.

Hva lærer jeg i «Sikker koding i Node.js»?

Implementer beste praksis for å forebygge vanlige sårbarheter som XSS, CSRF og SQL-injeksjon i Node.js-koden din. Du øver på Bootcamp i backendutvikling med Node.js med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Bootcamp i backendutvikling med Node.js?

Ingen tidligere erfaring er nødvendig. Bootcamp i backendutvikling med Node.js på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 2 av 4.

Hvor lang tid tar leksjonen «Sikker koding i Node.js»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Bootcamp i backendutvikling med Node.js-leksjonen?

Ja. Alle Bootcamp i backendutvikling med Node.js-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Forstå OWASP Top 10
  2. Sikker koding i Node.js
  3. Datakryptering og hashing
  4. Begrensning av forespørselsrate og beskyttelse mot brute force
← Tilbake til Bootcamp i backendutvikling med Node.js