HTML űrlapok biztonságos validálása kliens és szerver oldalon!

A biztonságos űrlapok két pillére: kliens- és szerveroldali validálás

Az interaktív webes alkalmazások gerincét az űrlapok alkotják. Még egy egyszerű bejelentkezési vagy regisztrációs felület is komoly kihívásokat jelenthet, ha nem kezeljük megfelelően a felhasználók által bevitt adatokat. A HTML-űrlapok validálása nem luxus, hanem alapvető biztonsági és felhasználói élménybeli követelmény.

Ebben a cikkben megvizsgáljuk, miért szükséges a validálás mind kliens-, mind szerveroldalon, hogyan valósítható meg a gyakorlatban, és milyen gyakori hibákat érdemes elkerülni.

Miért nem elég csak az egyik oldalon validálni?

A validálás célja kettős:

  • Azonnali visszajelzés biztosítása a felhasználó számára a hibás adatok esetén (kliensoldali validálás).
  • Az alkalmazás védelme a hibás vagy rosszindulatú adatokkal szemben (szerveroldali validálás).

A kliensoldali validálás gyors és kényelmes, azonban soha nem tekinthető biztonsági intézkedésnek. Egy tapasztalt felhasználó könnyedén kikapcsolhatja a JavaScriptet, módosíthatja a HTML-kódot, vagy közvetlen HTTP-kéréseket küldhet az alkalmazás felé, teljesen megkerülve a böngészőben futó ellenőrzéseket.

Ezért minden kliensoldali ellenőrzést kötelező megismételni a szerveroldalon is.

Kliensoldali validálás: a felhasználó első segítője

A modern HTML5 számos beépített validációs lehetőséget kínál, amelyek jelentősen csökkentik a szükséges JavaScript mennyiségét.

HTML5 beépített attribútumok

A required, minlength, maxlength, type="email", type="url", min és max attribútumok automatikus validálást biztosítanak.

A böngésző megakadályozza az űrlap elküldését, amíg ezek a feltételek nem teljesülnek, és alapértelmezett hibaüzeneteket jelenít meg.

JavaScript alapú finomhangolás

A beépített validáció sok esetben elegendő, de előfordulhat, hogy speciális szabályokat is szeretnénk alkalmazni. Erre szolgál a Constraint Validation API.

const form = document.getElementById('regisztracio'); const jelszoInput = document.getElementById('jelszo');  jelszoInput.addEventListener('input', () => {     const ertek = jelszoInput.value;      if (ertek.length > 0 && ertek.length < 8) {         jelszoInput.setCustomValidity(             'A jelszónak legalább 8 karakter hosszúnak kell lennie.'         );     } else {         jelszoInput.setCustomValidity('');     } });  form.addEventListener('submit', (event) => {     if (!form.checkValidity()) {         event.preventDefault();          alert('Kérjük, ellenőrizze a kitöltött adatokat!');     } });

Szerveroldali validálás: az utolsó védelmi vonal

A szerveroldali validálás biztosítja az adatok integritását és az alkalmazás biztonságát. Minden adatot ellenőrizni kell, függetlenül attól, hogy korábban kliensoldalon már validáltuk-e.

Az alábbi példa egy egyszerű Node.js és Express alapú megoldást mutat be:

const express = require('express');  const app = express();  app.use(express.urlencoded({ extended: true })); app.use(express.json());  app.post('/regisztracio', (req, res) => {     const { email, jelszo, szuletes, weboldal } = req.body;      const hibak = [];      const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;      if (!email || !emailRegex.test(email)) {         hibak.push('Érvénytelen e-mail cím.');     }      if (!jelszo || jelszo.length < 8) {         hibak.push(             'A jelszónak legalább 8 karakter hosszúnak kell lennie.'         );     }      const szuletesDate = new Date(szuletes);     const minDate = new Date('1900-01-01');     const maxDate = new Date();      if (         isNaN(szuletesDate.getTime()) ||         szuletesDate < minDate ||         szuletesDate > maxDate     ) {         hibak.push('Érvénytelen születési dátum.');     }      if (         weboldal &&         !weboldal.startsWith('http://') &&         !weboldal.startsWith('https://')     ) {         hibak.push(             'Az URL-nek http:// vagy https:// előtaggal kell kezdődnie.'         );     }      if (hibak.length > 0) {         return res.status(400).json({             sikeres: false,             hibak         });     }      res.json({         sikeres: true,         uzenet: 'Sikeres regisztráció!'     }); });

Biztonsági szempontok: több mint validálás

A validálás önmagában nem elegendő a biztonságos alkalmazás kialakításához.

1. SQL Injection elleni védelem

Mindig használjunk paraméterezett lekérdezéseket vagy ORM-rendszereket.

2. XSS (Cross-Site Scripting) elleni védelem

A felhasználói adatokat megjelenítés előtt megfelelően escape-elni vagy szűrni kell.

3. CSRF (Cross-Site Request Forgery) elleni védelem

Az állapotmódosító műveletekhez mindig használjunk CSRF-tokeneket.

4. Fájlfeltöltések ellenőrzése

Ne csak a fájl kiterjesztését ellenőrizzük, hanem a MIME-típust és lehetőség szerint a fájl tényleges tartalmát is.

Gyakori hibák és azok elkerülése

1. Csak kliensoldali validálás használata

Ez az egyik legveszélyesebb hiba. A kliensoldali ellenőrzések könnyen megkerülhetők.

2. Túl bonyolult reguláris kifejezések

Ne írjunk nehezen karbantartható regexeket, ha létezik megbízható könyvtár vagy beépített megoldás.

Népszerű könyvtárak:

  • validator.js
  • Joi
  • Yup
  • Zod

3. Nem megfelelő hibaüzenetek

A „Hibás bemenet” helyett adjunk pontos visszajelzést:

  • „Az e-mail cím formátuma érvénytelen.”
  • „A jelszónak legalább egy nagybetűt kell tartalmaznia.”

4. Bizalmas információk kiszivárogtatása

Ne áruljuk el, hogy egy adott felhasználónév létezik-e a rendszerben.

Rossz példa:

  • „A felhasználónév létezik, de a jelszó hibás.”

Jó példa:

  • „Hibás felhasználónév vagy jelszó.”

5. A validálás és a sanitizálás összekeverése

A validálás ellenőrzi az adat helyességét.

A sanitizálás megtisztítja az adatot a veszélyes vagy nem kívánt tartalmaktól.

Mindkettőre szükség van.

Összefoglalás

Az űrlapvalidálás egy kétlépcsős folyamat, amelynek mindkét része nélkülözhetetlen.

A kliensoldali validálás javítja a felhasználói élményt az azonnali visszajelzések segítségével, míg a szerveroldali validálás védi az alkalmazást és az adatokat a hibás vagy rosszindulatú bemenetektől.

Fontos szem előtt tartani, hogy a kliensoldali validálás kényelmi funkció, míg a szerveroldali validálás biztonsági kötelezettség.

A gyakorlatban érdemes a validációs szabályokat központilag kezelni, például külön validációs osztályok vagy függvények segítségével. Ez csökkenti a kódismétlést, növeli a karbantarthatóságot, és biztosítja a konzisztens működést az alkalmazás minden végpontján.

A megfelelő validálási stratégia nemcsak a hibás adatok ellen véd, hanem hozzájárul az alkalmazás megbízhatóságához, biztonságához és a felhasználók bizalmának növeléséhez is.