A bemeneti adatok validálása a beérkező adatok ellenőrzésének folyamata, amely során azokat az alkalmazás általi feldolgozás előtt a várt formátummal, típussal és értéktartománnyal vetjük össze. A OWASP Input Validation Cheat Sheet (2025) szerint a validálás hiánya a legtöbb kritikus sérülékenység gyökéroka. A beérkező adatok ellenőrzése az első védelmi vonal, amely megakadályozza, hogy hibás vagy káros adatok jussanak a rendszerbe.
Lényeg
A bemeneti adatok validálása annak ellenőrzése, hogy a felhasználótól, külső szolgáltatástól vagy más komponenstől az alkalmazásba érkező adatok megfelelnek-e a várt kritériumoknak. Ezek a kritériumok magukban foglalják az adattípust (karaktersorozat, szám, dátum), a formátumot (e-mail, URL, telefon), az értéktartományt (életkor 18 és 120 között), a hosszúságot (jelszó 8 és 128 karakter között) és a megengedett karaktereket (csak latin betűk, számjegyek, kötőjel). Validálás nélkül az alkalmazás olyan adatokat dolgozhat fel, amelyek futásidejű hibákat, adatsérülést vagy biztonsági sérülékenységeket okoznak.
A bemeneti adatok validálásának hiánya olyan sérülékenységek gyökéroka, mint az SQL Injection, XSS, Command Injection, Path Traversal és Buffer Overflow. A MITRE CWE (2025) szerint a CWE-20 (Improper Input Validation) a második helyen áll a legveszélyesebb szoftverhibák rangsorában. A validálás a első védelmi vonal a Defense in Depth biztonsági modellben: lefogja a hibás adatokat, mielőtt azok elérnék a rendszer más komponenseit.
A validálás elutasítja a kritériumoknak nem megfelelő adatokat. A szanitizálás (tisztítás) módosítja az adatokat a veszélyes részek eltávolításával vagy kódolásával. Például HTML-tartalom beírásakor a validálás ellenőrizheti a szöveg hosszát, a szanitizálás pedig eltávolíthatja a script-tageket a HTML Purifier vagy a DOMPurify könyvtár segítségével. A szanitizálás nem helyettesíti a validálást: együtt működnek. A validálás az „engedélyezett/tiltott“ politika, a szanitizálás pedig a „használat előtt megtisztított“.
A validálást az ellenőrzés mélysége szerint osztályozzuk. A formátumvalidálás a legegyszerűbb és leggyorsabb, az üzleti validálás pedig a legösszetettebb és leginkább kontextusfüggő. Mindhárom szintet egymás után kell alkalmazni: először a formátumot, majd a szemantikát, végül az üzleti logikát. Bármely szint kihagyása a rendszer hibás működéséhez vagy sérülékenységekhez vezethet.
| Szint | Mit ellenőriz | Példa |
|---|---|---|
| Formátum | Adattípus, hosszúság, reguláris kifejezés | Az e-mail tartalmazza a @ jelet, hossza 5-100 |
| Szemantikai | Az érték logikai helyessége | A születési dátum nem a jövőben van |
| Üzleti validálás | Üzleti szabályoknak való megfelelés | Az átutalás összege nem haladja meg az egyenleget |
Az adattípus, a méret, a formátum és a megengedett karakterek ellenőrzése. Reguláris kifejezésekkel, a nyelvek beépített típusaival és validáló könyvtárakkal valósul meg. Példák: UUID-ellenőrzés (8-4-4-4-12 hexadecimális számjegy formátuma), telefonszám-ellenőrzés (csak számjegyek, + az elején, 7 és 15 karakter között), egész szám ellenőrzése (érték az Integer.MIN_VALUE — Integer.MAX_VALUE tartományban). A formátumvalidálás a minimálisan szükséges szint minden beviteli mezőhöz.
Az adatok logikai helyességének ellenőrzése a szakterület kontextusában. Például: a kezdő dátum nem későbbi, mint a záró dátum, az életkor az ésszerű határokon belül van a rendszer számára, a koordináták a szolgáltatási területen belül vannak. A szemantikai validálás üzleti kontextus megértését igényli, és nem végezhető el csak a formátum alapján. Példa: a „jegyek száma“ mező átmehet a formátumellenőrzésen (egész szám, > 0), de szemantikailag nem haladhatja meg a szabad helyek számát.
A legösszetettebb szint — az adatok ellenőrzése az alkalmazás üzleti szabályainak való megfelelés szempontjából. Példák: a felhasználó nem törölheti az egyetlen adminisztrátort, a rendelés összege nem haladja meg a hitelkeretet, a termék csak akkor rendelhető, ha készleten van. Az üzleti validálás gyakran adatbázis-lekérdezéseket vagy külső szolgáltatásokat igényel, és a formátum- és szemantikai ellenőrzések után történik. Az üzleti validálás hibái a felhasználói elégedetlenség leggyakoribb okai.
A kliensoldali validálásra (böngészőben vagy mobilalkalmazásban) a felhasználó kényelme miatt van szükség: azonnali visszajelzés anélkül, hogy az adatokat elküldenénk a szerverre. A szerveroldali validálás azonban az egyetlen megbízható, mert a kliens kódja mindig megkerülhető. Küldje el a kéréseket fejlesztői eszközökön, a Postmanen vagy proxyn (Burp Suite) keresztül — és a kliensoldali validálás megszűnik létezni. A PortSwigger Research (2025) szerint a tesztelt webalkalmazások több mint 90%-a legalább egy mező esetében kizárólag a kliensoldali validálásra támaszkodik.
A kliensoldali validálás letilthatja a küldés gombot, kiemelheti a hibákat, tippeket jeleníthet meg. A szerveroldali validálás minden paraméter kötelező ellenőrzése, még akkor is, ha a kliens már ellenőrizte. A validálás megkettőzése mindkét szinten bevett gyakorlat. A szervernek úgy kell ellenőriznie az adatokat, mintha a kliens nem is létezne. Ez garantálja a védelmet a módosított kérések, az automatizált támadások és a káros kliensek ellen.
A weben — HTML5-attribútumok (required, pattern, min/max, type="email") és JavaScript. Mobilalkalmazásokban — a szövegmezők natív validátorai (InputFilter Androidon, textField(:shouldChangeCharactersIn:) iOS-en). React Hook Form és Formik a Reacthez, Vuelidate a Vue-hoz, Angular Reactive Forms — népszerű könyvtárak a kliensoldali validáláshoz. Mindegyik támogatja az egyedi szabályokat és az aszinkron validálást (a bejelentkezési név egyediségének ellenőrzése a szerveren).
// Példa szerveroldali validálásra Expressen a Joival
const Joi = require('joi');
const userSchema = Joi.object({
email: Joi.string()
.email()
.required()
.max(255),
age: Joi.number()
.integer()
.min(18)
.max(120)
.required(),
password: Joi.string()
.pattern(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,128}$/)
.required()
});
app.post('/api/users', async (req, res) => {
const { error, value } = userSchema.validate(req.body);
if (error) {
return res.status(400).json({
error: error.details[0].message
});
}
// value — már ellenőrzött és biztonságos adatok
const user = await User.create(value);
res.status(201).json(user);
});
A mobilalkalmazások különleges követelményeket támasztanak az adatvalidálással szemben. A képernyő kisebb — a hibáknak tömöreknek kell lenniük, a billentyűzet kontextuális (numerikus a számok beviteléhez), az ellenőrzés pedig aszinkron, hogy ne blokkolja a felületet. A natív platformok beépített validálási mechanizmusokat kínálnak, amelyeket alapértelmezetten használni kell. A Material Design Guidelines Androidhoz és a Human Interface Guidelines iOS-hez részletes ajánlásokat tartalmaz a validálási hibák megjelenítéséről.
A Jetpack Compose deklaratív megközelítést kínál a validáláshoz állapotkezelésen keresztül. Minden beviteli mező egy állapothoz (MutableState) kapcsolódik, a hiba pedig az aktuális érték alapján számítódik ki. A Compose Validator könyvtár leegyszerűsíti a szabályok létrehozását: required, email, min/max length, pattern. A validálás a szöveg változásakor (onValueChange) vagy az űrlap elküldésére tett kísérletkor aktiválódik. Javasolt a hibát csak az első elküldés után vagy a felhasználó bevitele befejezése után megjeleníteni (debounce 300-500ms).
A SwiftUI-nak nincs beépített űrlapvalidálási mechanizmusa, de lehetővé teszi annak könnyű megvalósítását Combine és property wrappers segítségével. Használjon @State-et a mező értékéhez és számított tulajdonságot a hibához. A ValidatedPropertyKit keretrendszer kész dekorátorokat biztosít: @Validated().email(), @Validated().range(18...120). iOS-ajánlás — használja a billentyűzettípusokat (UIKeyboardType.emailAddress, .numberPad) és az auto-capitalization-t, hogy csökkentse a hibák számát a bevitelek szintjén.
A Flutter biztosítja a Form és TextFormField osztályt beépített validálással a validator-callback segítségével. Minden mező hibát ad vissza szövegként, vagy null-t, ha az adatok helyesek. A FormState.validate() elindítja az űrlap összes mezőjének ellenőrzését. A reactive_forms csomag az összetett esetekhez: egyedi validátorok, aszinkron ellenőrzés, dinamikus szabályok. A Flutter Web és a mobil verzió ugyanazt az API-t használja, ami leegyszerűsíti a karbantartást.
// Példa űrlapvalidálásra Flutterben
Form(
key: _formKey,
child: Column(
children: [
TextFormField(
decoration: InputDecoration(labelText: 'Email'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Email is required';
}
if (!RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$')
.hasMatch(value)) {
return 'Enter a valid email';
}
return null;
},
),
ElevatedButton(
onPressed: () {
if (_formKey.currentState!.validate()) {
// Process valid data
}
},
child: Text('Submit'),
),
],
),
)
A modern keretrendszerek beépített validátorokat kínálnak, amelyek a szükségletek 80%-át lefedik. A fennmaradó 20% egyedi szabályokat, reguláris kifejezéseket vagy a meglévők kombinációját igényli. A kulcsfontosságú elv — a validálásnak deklaratívnak kell lennie, hogy könnyen lehessen olvasni, tesztelni és karbantartani. Kerülje a vezérlők és képernyők között szétszórt validálási logikát — helyezze azt külön osztályokba vagy sémákba.
| Eszköz | Platform | Jellemzők |
|---|---|---|
| Joi | Node.js | Deklaratív sémák, egyedi üzenetek |
| Pydantic | Python | Type hints, a modell automatikus validálása |
| Zod | TypeScript | Type inference, szigorú tipizálás |
| javax.validation | Java | Bean Validation, @NotNull, @Size, @Pattern |
| FluentValidation | .NET | Fluent API, rulesets, feltételes szabályok |
White-list (fehér lista) — Ön határozza meg, mely adatok engedélyezettek, minden más elutasításra kerül. Black-list — Ön határozza meg, mely adatok tiltottak, minden más átengedésre kerül. A white-list mindig megbízhatóbb: pontosan tudja, mely adatok fognak átmenni. A black-list megköveteli az összes lehetséges támadás előrejelzését, ami lehetetlen. Példa: az életkor ellenőrzésekor használjon white-listet (csak számok 18 és 120 között), ne black-listet („0“, „-1“, „999999“ tiltása).
A reguláris kifejezések hatékony eszközei a formátumvalidálásnak, de ReDoS-támadások (Regular Expression Denial of Service) forrásai lehetnek. Egyes minták (például a (a+)+b) hosszú karaktersorozatokon katasztrofális visszalépést (backtracking) okoznak, teljesen leterhelve a szerver CPU-ját. Használjon kipróbált regex-könyvtárakat, és a reguláris kifejezés alkalmazása előtt korlátozza a karaktersorozat hosszát. Összetett esetekben (e-mail, URL) használja a nyelvek beépített elemzőit a saját reguláris kifejezések helyett.
Még a tapasztalt fejlesztők is hibáznak a validálás megvalósítása során. A leggyakoribbak: csak kliensoldali validálás, túl szigorú szabályok (jelszó „Must contain uppercase, lowercase, digit, special char, >= 12 chars, must not repeat characters“), nem informatív hibaüzenetek ("Error: invalid input") és a határesetek (szóközök elején/végén, Unicode-karakterek, üres karaktersorozatok) figyelmen kívül hagyása. Mindegyik hiba rontja az UX-et, és csökkentheti az űrlapok konverzióját.
if (value) nem különbözteti meg az üres karaktersorozatot a nullától, a false-tól vagy a „0“-tólA legjobb gyakorlat — egységtesztekkel lefedett, központosított validálási rendszer. Minden szabályt külön kell tesztelni: határértékek, helyes adatok, tipikus támadások (SQLi-kísérletek, XSS-payloadok, nagyon hosszú karaktersorozatok). A validálás regressziós tesztjei megakadályozzák a szabályok véletlen meggyengülését refaktorálás közben. Használjon property-based testing-et (QuickCheck, fast-check) véletlenszerű adatok generálásához és annak ellenőrzéséhez, hogy a validálás nem esik össze kivétellel.
Gyakran ismételt kérdések
A validálás elutasítja a hibás adatokat, a szanitizálás pedig megtisztítja azokat. Például HTML-szöveg beírásakor a validálás ellenőrzi a maximális hosszt, a szanitizálás pedig eltávolítja a script-tageket a DOMPurify segítségével. Mindkét folyamat kötelező: a validálás — a formátumellenőrzésért, a szanitizálás — a kimenet biztonságáért.
Nem, soha. A kliensoldali validálás könnyen megkerülhető a kérések elfogásával és módosításával. Használjon olyan eszközöket, mint a Burp Suite, vagy egyszerűen a curl-t. A szerveroldali validálás az egyetlen megbízható módja a rendszer védelmének. A kliensoldali validálás csak a felhasználói élmény javítására szolgál.
Ellenőrizze a MIME-típust (nem csak a kiterjesztést), a fájlméretet és az aláírást (a fájl elején található mágikus bájtokat) file signature validation segítségével. Soha ne bízzon a kiterjesztésben — mentéskor nevezze át a fájlt. Képek esetén transzkódolja őket szerveroldali könyvtárral (ImageMagick, Sharp), ami eltávolítja az EXIF-adatokba ágyazott kódot.
A ReDoS (Regular Expression Denial of Service) olyan támadás, amelynek során a támadó egy speciálisan megszerkesztett karaktersorozatot küld, amely katasztrofális visszalépést (backtracking) okoz a reguláris kifejezésben. Ennek eredményeként a szerver CPU-ja 100%-ban leterhelődik, és nem jön létre válasz. Védelem: a karaktersorozat hosszának korlátozása, időtúllépés a regexhez, kipróbált minták használata.
Igen, ha az adatok WebView-ban jelennek meg, vagy HTML-kontextusban használják őket. Ha a backendet kompromittálták, az adatok káros kódot tartalmazhatnak. Validáljon és szanitizáljon minden felhasználónak megjelenített adatot, a forrástól függetlenül. Mobilalkalmazásokban ez különösen fontos a hibrid komponensek esetében.
Összegzés
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is