Node.js-taustakehityksen bootcamp · Oppitunti

Turvallisen koodin käytännöt Node.js:ssä

Toteuttakaa parhaat käytännöt yleisten haavoittuvuuksien, kuten XSS:n, CSRF:n ja SQL-injektioiden, estämiseksi Node.js-koodissa.

Oppitunti 2/411 vaihetta

Turvallisen koodin käytännöt Node.js:ssä on ilmainen Node.js-taustakehityksen bootcamp-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Node.js-taustakehityksen bootcamp-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Node.js-taustakehityksen bootcamp-kurssilla on yhteensä 4 oppituntia.

Miksi turvallinen koodaus on tärkeää

Tervetuloa! Tässä oppitunnissa perehdymme Node.js:n keskeisiin turvallisen koodauksen käytäntöihin. Turvallisen koodin kirjoittaminen on yhtä tärkeää kuin toimivan koodin kirjoittaminen.

Yleisten haavoittuvuuksien ymmärtäminen ja estäminen suojaavat sovellustasi ja käyttäjiäsi haitallisilta hyökkäyksiltä.

  • Tietomurrot: Arkaluonteisten tietojen paljastuminen.
  • Palvelukatkot: Hyökkäykset voivat kaataa sovelluksesi.
  • Mainehaitat: Käyttäjien luottamuksen menetys.
Turvallisen koodin käytännöt Node.js:ssä — kuvitus 1

Cross-Site Scripting (XSS)

Cross-Site Scripting (XSS) on yleinen verkkosovellusten haavoittuvuus, jossa hyökkääjät lisäävät haitallisia komentosarjoja (yleensä JavaScriptiä) muiden käyttäjien näkemiin verkkosivuihin.

Kun käyttäjän selain lataa kyseisen sivun, haitallinen komentosarja suoritetaan, ja se voi varastaa evästeitä ja istuntotunnisteita tai muuttaa sivun sisältöä.

  • Heijastettu XSS: Käyttäjän syötteestä välittömästi suoritettava komentosarja.
  • Tallennettu XSS: Tietokantaan tallennettu haitallinen komentosarja, joka näytetään myöhemmin käyttäjille.
  • DOM-pohjainen XSS: Asiakaspuolen koodissa oleva haavoittuvuus, joka muuttaa DOM-rakennetta.

XSS:n estäminen: tulosteen escapointi

Ensisijainen puolustus XSS-hyökkäyksiä vastaan on olla koskaan luottamatta käyttäjän syötteeseen ja aina escapottaa se ennen sen renderöimistä HTML:ksi.

Tämä tarkoittaa esimerkiksi merkkien <, >, & ja " muuntamista niitä vastaaviksi HTML-entiteeteiksi (esimerkiksi &lt; ja &gt;). Tällöin selain tulkitsee ne tekstiksi eikä suoritettavaksi koodiksi.

Kokeile suorittaa tämä esimerkki:

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);

XSS:n estäminen: CSP

Evästämisen lisäksi Content Security Policy (CSP) tarjoaa uuden suojakerroksen XSS-hyökkäyksiä vastaan.

CSP on HTTP-otsake, joka kertoo selaimille, mitkä dynaamiset resurssit (komentosarjat, tyylit ja kuvat) saavat latautua ja mistä lähteistä. Se voi lieventää XSS-hyökkäysten vaikutuksia merkittävästi estämällä luvattomien komentosarjojen suorittamisen.

Esimerkkiotsake: Content-Security-Policy: default-src 'self'; script-src 'self' trusted.cdn.com;

SQL-injektio selitettynä

SQL-injektio (SQLi) on verkkoturvallisuuden haavoittuvuus, jonka avulla hyökkääjä voi vaikuttaa kyselyihin, joita sovellus tekee tietokantaansa.

Syöttämällä haitallista SQL-koodia syöttökenttiin hyökkääjä voi huijata tietokannan suorittamaan tahattomia komentoja, kuten paljastamaan arkaluonteisia tietoja, muokkaamaan tietoja tai jopa poistamaan tauluja.

Yleinen esimerkki on kirjautumiskyselyn muuttaminen niin, että todennus voidaan ohittaa ilman salasanaa.

SQLi:n estäminen: parametroidut kyselyt

Tehokkain tapa estää SQL-injektio on käyttää parametroituja kyselyitä (joita kutsutaan myös valmistelluiksi lauseiksi).

Käyttäjän syötettä ei upoteta suoraan SQL-merkkijonoon, vaan arvoille käytetään paikanhaltijoita. Tietokanta käsittelee paikanhaltijoita datana eikä suoritettavana SQL-koodina, mikä estää haitallisen injektion.

ORM-kehykset (Object-Relational Mappers), kuten MongoDB:n Mongoose tai SQL-tietokantojen Sequelize, hoitavat tämän automaattisesti.

/*
  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) on hyökkäys, jossa kirjautunut käyttäjä huijataan suorittamaan tahaton toiminto verkkosovelluksessa.

Kuvitellaan, että olet kirjautunut pankkipalveluun. Hyökkääjä lähettää sinulle haitallisen linkin (esimerkiksi sähköpostitse). Jos napsautat sitä, hyökkääjän sivusto voi tehdä pyynnön pankkiisi käyttäen todennettua istuntoasi ja pakottaa sinut siirtämään rahaa tietämättäsi.

Hyökkäys perustuu siihen, että selain lähettää istuntoevästeesi automaattisesti pankin verkkotunnukseen tehtävän pyynnön mukana.

CSRF:n estäminen: CSRF-tunnisteet

CSRF-hyökkäysten estämiseen käytetään CSRF-tunnisteita. Palvelin luo jokaiselle käyttäjän istunnolle yksilöllisen ja ennalta arvaamattoman tunnisteen, joka upotetaan lomakkeisiin tai otsakkeisiin.

Kun käyttäjä lähettää pyynnön, palvelin tarkistaa, vastaako lähetetty tunniste käyttäjän istuntoon tallennettua tunnistetta. Jos ne eivät täsmää, pyyntö hylätään.

Koska hyökkääjä ei voi tietää tai väärentää toisen käyttäjän yksilöllistä tunnistetta, hän ei voi huijata käyttäjää tekemään kelvollista pyyntöä.

/*
  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));

Muut turvallisuusotsakkeet

Keskeisten haavoittuvuuksien lisäksi useat muut HTTP-turvallisuusotsakkeet voivat parantaa Node.js-sovelluksesi turvallisuutta:

  • X-Content-Type-Options: nosniff: Estää selaimia päättelemästä vastauksen sisältötyyppiä, mikä voi estää XSS-hyökkäyksiä.
  • X-Frame-Options: DENY: Estää sivustosi upottamisen <iframe>-elementtiin ja suojaa klikkauskaappaus-hyökkäyksiltä.
  • Strict-Transport-Security (HSTS): Pakottaa selaimet muodostamaan yhteyden sivustoosi vain HTTPS:n kautta ja estää yhteyden suojaustason alentamiseen perustuvat hyökkäykset.

Nämä otsakkeet määritetään yleensä Express.js:n kaltaisten viitekehysten väliohjelmistolla.

Turvallisuushaavoittuvuuden tarkistus

Mikä seuraavista on tehokkain suoja SQL-injektiohyökkäyksiä vastaan?

Turvallisen koodauksen kertaus

Hienoa työtä! Olet oppinut tärkeitä turvallisen koodauksen käytäntöjä Node.js:ssä.

  • XSS: Estä se evästämällä kaikki käyttäjän luoma sisältö ennen sen renderöintiä HTML:ksi ja käyttämällä CSP:tä.
  • SQL-injektio: Estä se käyttämällä aina parametroituja kyselyitä tai ORM-kehyksiä.
  • CSRF: Estä se ottamalla käyttöön CSRF-tunnisteet tilaa muuttaville pyynnöille.
  • Muista käyttää myös muita turvallisuusotsakkeita, kuten X-Content-Type-Options- ja X-Frame-Options-otsakkeita, jotta suojaus on kattavampi.

Oleta aina, että käyttäjän syöte on haitallista, ja validoi, puhdista tai evästä se asianmukaisesti!

Aloita maksutta

Opi JavaScript tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
22
Oppitunnit
92

Usein kysytyt kysymykset

Onko oppitunti ”Turvallisen koodin käytännöt Node.js:ssä” ilmainen?

Kyllä – oppitunnin ”Turvallisen koodin käytännöt Node.js:ssä” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Node.js-taustakehityksen bootcamp-kurssin, päivitä CoddyKit PROhon. Node.js-taustakehityksen bootcamp-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Turvallisen koodin käytännöt Node.js:ssä”?

Toteuttakaa parhaat käytännöt yleisten haavoittuvuuksien, kuten XSS:n, CSRF:n ja SQL-injektioiden, estämiseksi Node.js-koodissa. Harjoittelet Node.js-taustakehityksen bootcamp-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Node.js-taustakehityksen bootcamp-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Node.js-taustakehityksen bootcamp-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Turvallisen koodin käytännöt Node.js:ssä”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Node.js-taustakehityksen bootcamp-oppitunnilla?

Kyllä. Jokainen Node.js-taustakehityksen bootcamp-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. OWASP Top 10:n ymmärtäminen
  2. Turvallisen koodin käytännöt Node.js:ssä
  3. Tietojen salaus ja hajautus
  4. Pyyntöjen rajoittaminen ja brute force -hyökkäysten torjunta
← Takaisin: Node.js-taustakehityksen bootcamp