Sikker kodning i Node.js
Implementér bedste praksis for at forebygge almindelige sårbarheder som XSS, CSRF og SQL injection i jeres Node.js-kode.
Sikker kodning i Node.js er en gratis Bootcamp i backendudvikling med Node.js-lektion på CoddyKit. Dette er lektion 2 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Bootcamp i backendudvikling med Node.js, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Bootcamp i backendudvikling med Node.js-kurset indeholder 4 lektioner i alt.
Hvorfor sikker kodning er vigtig
Velkommen! I denne lektion ser vi nærmere på vigtig praksis for sikker kodning i Node.js. Det er lige så vigtigt at skrive sikker kode som at skrive kode, der fungerer.
Ved at forstå og forhindre almindelige sårbarheder beskytter du din applikation og dine brugere mod ondsindede angreb.
- Databrud: Eksponering af følsomme oplysninger.
- Driftsstop: Angreb kan få din applikation til at gå ned.
- Skadet omdømme: Tab af brugernes tillid.

Cross-Site Scripting (XSS)
Cross-Site Scripting (XSS) er en almindelig websårbarhed, hvor angribere indsætter ondsindede scripts (normalt JavaScript) i websider, som andre brugere ser.
Når en brugers browser indlæser den berørte side, udføres det ondsindede script, hvilket potentielt kan stjæle cookies eller sessionstokens eller ændre sidens indhold.
- Reflekteret XSS: Scriptet udføres straks ud fra brugerinput.
- Gemt XSS: Det ondsindede script gemmes i en database og leveres derefter til brugere.
- DOM-baseret XSS: Sårbarhed i klientkode, der ændrer DOM'en.
Forebyg XSS: Escap output
Det primære forsvar mod XSS er at aldrig stole på brugerinput og altid escape det, før det gengives som HTML.
Det betyder, at tegn som <, >, & og " konverteres til deres tilsvarende HTML-entiteter (f.eks. <, >). På den måde fortolker browseren dem som tekst og ikke som kode, der kan udføres.
Prøv at køre dette eksempel:
function escapeHtml(str) {
return str
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
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);Forebyg XSS: CSP
Ud over escaping tilføjer en Content Security Policy (CSP) endnu et forsvarslag mod XSS.
CSP er en HTTP-header, der fortæller browsere, hvilke dynamiske ressourcer (scripts, typografier, billeder) der må indlæses, og hvorfra de må indlæses. Den kan i betydelig grad begrænse virkningen af XSS-angreb ved at blokere uautoriseret kørsel af scripts.
Eksempel på en header: Content-Security-Policy: default-src 'self'; script-src 'self' trusted.cdn.com;
SQL-injektion forklaret
SQL Injection (SQLi) er en sikkerhedssårbarhed i webapplikationer, som gør det muligt for en angriber at påvirke de forespørgsler, en applikation sender til sin database.
Ved at indsætte skadelig SQL-kode i inputfelter kan en angriber narre databasen til at udføre utilsigtede kommandoer, f.eks. afsløre følsomme data, ændre data eller endda slette tabeller.
Et almindeligt eksempel er at ændre en loginforespørgsel, så godkendelsen omgås uden kendskab til adgangskoden.
Forebyg SQLi: Parametriserede forespørgsler
Den mest effektive måde at forebygge SQL Injection på er at bruge parametriserede forespørgsler (også kaldet prepared statements).
I stedet for at indsætte brugerinput direkte i SQL-strengen bruger du pladsholdere til værdierne. Databasen behandler derefter disse pladsholdere som data og ikke som SQL-kode, der kan køres, hvilket forhindrer skadelig injektion.
ORM'er (Object-Relational Mappers) som Mongoose til MongoDB eller Sequelize til 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 angreb, der narrer en logget bruger til at udføre en utilsigtet handling i en webapplikation.
Forestil dig, at du er logget ind i din bank. En angriber sender dig et skadeligt link (f.eks. i en e-mail). Hvis du klikker på det, kan angriberens websted sende en forespørgsel til din bank ved hjælp af din godkendte session og få dig til at overføre penge uden din viden.
Det afgørende er, at browseren automatisk sender dine sessionscookies med forespørgslen til bankens domæne.
Forebyg CSRF: CSRF-tokens
For at forebygge CSRF bruger vi CSRF-tokens. Serveren genererer et unikt og uforudsigeligt token for hver brugersession og indsætter det i formularer eller headere.
Når brugeren sender en forespørgsel, kontrollerer serveren, om det indsendte token stemmer overens med det, der er gemt i brugerens session. Hvis de ikke stemmer overens, afvises forespørgslen.
Da en angriber ikke kan kende eller forfalske dette unikke token for en anden bruger, kan angriberen ikke narre brugeren til at sende en gyldig forespørgsel.
/*
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 sikkerhedsheadere
Ud over de grundlæggende sårbarheder kan flere andre HTTP-sikkerhedsheadere forbedre sikkerheden i din Node.js-applikation:
X-Content-Type-Options: nosniff: Forhindrer browsere i at "sniffe" en responses indholdstype, hvilket kan forhindre XSS-angreb.X-Frame-Options: DENY: Forhindrer, at dit websted integreres i en<iframe>, og beskytter mod clickjacking-angreb.Strict-Transport-Security (HSTS): Tvinger browsere til kun at oprette forbindelse til dit websted via HTTPS og forhindrer downgrade-angreb.
Disse headere sættes typisk ved hjælp af middleware i frameworks som Express.js.
Kontrol af sikkerhedssårbarheder
Hvilken af følgende muligheder er det mest effektive forsvar mod SQL Injection-angreb?
Opsummering af sikker kodning
Godt gået! Du har lært om vigtige metoder til sikker kodning i Node.js.
- XSS: Forebyg det ved at escape alt brugergenereret indhold, før det gengives som HTML, og brug CSP.
- SQL Injection: Forebyg det ved altid at bruge parametriserede forespørgsler eller ORM'er.
- CSRF: Forebyg det ved at implementere CSRF-tokens til forespørgsler, der ændrer tilstand.
- Husk også at bruge andre sikkerhedsheadere som
X-Content-Type-OptionsogX-Frame-Optionsfor et mere robust forsvar.
Antag altid, at brugerinput er skadeligt, og valider, rens eller escape det på passende vis!
Lær JavaScript med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 22
- Lektioner
- 92
Ofte stillede spørgsmål
Er lektionen “Sikker kodning i Node.js” gratis?
Ja — hele teksten til “Sikker kodning i Node.js” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Bootcamp i backendudvikling med Node.js-kurset, skal du opgradere til CoddyKit PRO. Bootcamp i backendudvikling med Node.js-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Sikker kodning i Node.js”?
Implementér bedste praksis for at forebygge almindelige sårbarheder som XSS, CSRF og SQL injection i jeres Node.js-kode. Du øver dig i Bootcamp i backendudvikling med Node.js med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på Bootcamp i backendudvikling med Node.js?
Der kræves ingen tidligere erfaring. Bootcamp i backendudvikling med Node.js på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 4.
Hvor lang tid tager lektionen “Sikker kodning i Node.js”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne Bootcamp i backendudvikling med Node.js-lektion?
Ja. Alle Bootcamp i backendudvikling med Node.js-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Forstå OWASP Top 10
- Sikker kodning i Node.js
- Datakryptering og hashing
- Rate limiting og beskyttelse mod brute force