Validarea datelor de intrare este procesul de verificare a datelor primite pentru conformitatea cu formatul, tipul și intervalul de valori așteptate, înainte de prelucrarea lor de către aplicație. Conform OWASP Input Validation Cheat Sheet (2025), lipsa validării este cauza principală a majorității vulnerabilităților critice. Verificarea datelor primite este prima linie de apărare care împiedică pătrunderea datelor incorecte sau malițioase în sistem.
Esențial
Validarea datelor de intrare înseamnă verificarea că datele care ajung în aplicație de la utilizator, de la un serviciu extern sau de la alt component corespund criteriilor așteptate. Aceste criterii includ tipul datelor (șir, număr, dată), formatul (email, URL, telefon), intervalul de valori (vârsta de la 18 la 120), lungimea (parola de la 8 la 128 de caractere) și caracterele permise (doar litere latine, cifre, cratimă). Fără validare, aplicația poate prelucra date care provoacă erori de execuție, coruperea datelor sau vulnerabilități de securitate.
Lipsa validării datelor de intrare este cauza principală a unor vulnerabilități precum SQL Injection, XSS, Command Injection, Path Traversal și Buffer Overflow. Conform MITRE CWE (2025), CWE-20 (Improper Input Validation) ocupă locul doi în clasamentul celor mai periculoase erori software. Validarea este prima linie de apărare în modelul de securitate Defense in Depth: elimină datele incorecte înainte ca acestea să ajungă la alte componente ale sistemului.
Validarea respinge datele care nu respectă criteriile. Sanitizarea (curățarea) modifică datele, eliminând sau escapând părțile periculoase. De exemplu, la introducerea conținutului HTML, validarea poate verifica lungimea textului, iar sanitizarea poate elimina tag-urile script prin biblioteca HTML Purifier sau DOMPurify. Sanitizarea nu înlocuiește validarea: ele lucrează împreună. Validarea este politica „permis/interzis”, sanitizarea este „curățat înainte de utilizare”.
Validarea se clasifică după adâncimea verificării. Validarea de format este cea mai simplă și rapidă, iar validarea de business este cea mai complexă și dependentă de context. Toate cele trei niveluri trebuie aplicate secvențial: mai întâi formatul, apoi semantica, apoi logica de business. Omisiunea oricărui nivel poate duce la funcționarea incorectă a sistemului sau la vulnerabilități.
| Nivel | Ce verifică | Exemplu |
|---|---|---|
| De format | Tipul datelor, lungimea, expresia regulată | Emailul conține @, lungime 5-100 |
| Semantică | Corectitudinea logică a valorii | Data nașterii nu este în viitor |
| De business | Conformitatea cu regulile de business | Suma transferului nu depășește soldul |
Verificarea tipului datelor, dimensiunii, formatului și caracterelor permise. Se realizează prin expresii regulate, tipuri incorporate ale limbajelor și biblioteci de validare. Exemple: verificarea UUID (format 8-4-4-4-12 cifre hexazecimale), verificarea numărului de telefon (doar cifre, + la început, de la 7 la 15 caractere), verificarea numărului întreg (valoare în intervalul Integer.MIN_VALUE — Integer.MAX_VALUE). Validarea de format este nivelul minim necesar pentru orice câmp de intrare.
Verificarea corectitudinii logice a datelor în contextul domeniului. De exemplu: data de început nu este mai târziu decât data de sfârșit, vârsta este în limite rezonabile pentru sistem, coordonatele sunt în aria de servire. Validarea semantică necesită înțelegerea contextului de business și nu poate fi realizată doar pe baza formatului. Exemplu: câmpul „număr de bilete” poate trece de verificarea de format (număr întreg, > 0), dar semantic nu poate depăși numărul de locuri libere.
Cel mai complex nivel — verificarea datelor pentru conformitatea cu regulile de business ale aplicației. Exemple: utilizatorul nu poate șterge singurul administrator, suma comenzii nu depășește limita de credit, produsul poate fi comandat doar dacă este în stoc. Validarea de business necesită adesea interogări ale bazei de date sau servicii externe și se realizează după verificările de format și semantice. Erorile de validare de business sunt cele mai frecvente cauze de nemulțumire a utilizatorilor.
Validarea pe client (în browser sau în aplicația mobilă) este necesară pentru confortul utilizatorului: feedback imediat fără trimiterea datelor pe server. Totuși, validarea pe server este singura fiabilă, deoarece codul clientului poate fi întotdeauna ocolit. Trimiteți cereri prin instrumentele de dezvoltare, Postman sau un proxy (Burp Suite) — și validarea pe client încetează să existe. Conform PortSwigger Research (2025), peste 90% dintre aplicațiile web testate se bazează exclusiv pe validarea pe client pentru cel puțin un câmp.
Validarea pe client poate dezactiva butonul de trimitere, evidenția erorile, afișa sugestii. Validarea pe server este verificarea obligatorie a fiecărui parametru, chiar dacă clientul l-a verificat deja. Dublarea validării la ambele niveluri este o practică standard. Serverul trebuie să verifice datele ca și cum clientul nu ar exista. Aceasta garantează protecția împotriva cererilor modificate, atacurilor automatizate și clienților malițioși.
Pe web — atributele HTML5 (required, pattern, min/max, type="email") și JavaScript. În aplicațiile mobile — validatoare native pentru câmpuri de text (InputFilter în Android, textField(:shouldChangeCharactersIn:) în iOS). React Hook Form și Formik pentru React, Vuelidate pentru Vue, Angular Reactive Forms — biblioteci populare pentru validarea pe client. Toate suportă reguli personalizate și validare asincronă (verificarea unicității loginului pe server).
// Exemplu de validare pe server cu Express și Joi
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 — date deja verificate și sigure
const user = await User.create(value);
res.status(201).json(user);
});
Aplicațiile mobile impun cerințe speciale pentru validarea datelor. Ecranul este mai mic — erorile trebuie să fie concise, tastatura contextuală (numerică pentru introducerea numerelor), iar verificarea — asincronă, pentru a nu bloca interfața. Platformele native oferă mecanisme incorporate de validare care ar trebui folosite implicit. Material Design Guidelines pentru Android și Human Interface Guidelines pentru iOS conțin recomandări detaliate despre afișarea erorilor de validare.
Jetpack Compose oferă o abordare declarativă a validării prin gestionarea stării. Fiecare câmp de intrare este legat de o stare (MutableState), iar eroarea este calculată pe baza valorii curente. Biblioteca Compose Validator simplifică crearea regulilor: required, email, min/max length, pattern. Validarea se declanșează la schimbarea textului (onValueChange) sau la încercarea de trimitere a formularului. Se recomandă afișarea erorii doar după prima trimitere sau după ce utilizatorul a terminat introducerea (debounce 300-500ms).
SwiftUI nu are un mecanism incorporat de validare a formularelor, dar permite implementarea ușoară a acestuia prin Combine și property wrappers. Folosiți @State pentru valoarea câmpului și o proprietate calculată pentru eroare. Framework-ul ValidatedPropertyKit oferă decoratori gata pregătiți: @Validated().email(), @Validated().range(18...120). Recomandarea iOS — folosiți tipurile de tastatură (UIKeyboardType.emailAddress, .numberPad) și auto-capitalization pentru a reduce numărul de erori la nivelul introducerii.
Flutter oferă clasa Form și TextFormField cu validare incorporată prin callback-ul validator. Fiecare câmp returnează eroarea ca șir sau null dacă datele sunt corecte. FormState.validate() declanșează verificarea tuturor câmpurilor formularului. Pachetul reactive_forms pentru cazuri complexe: validatoare personalizate, verificare asincronă, reguli dinamice. Flutter Web și versiunea mobilă folosesc același API, ceea ce simplifică întreținerea.
// Exemplu de validare a formularului pe Flutter
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'),
),
],
),
)
Framework-urile moderne oferă validatoare incorporate care acoperă 80% din necesități. Restul de 20% necesită reguli personalizate, expresii regulate sau compoziția celor existente. Principiul-cheie — validarea trebuie să fie declarativă pentru a fi ușor de citit, testat și întreținut. Evitați logica de validare împrăștiată prin controllere și ecrane — mutați-o în clase sau scheme separate.
| Instrument | Platformă | Caracteristici |
|---|---|---|
| Joi | Node.js | Scheme declarative, mesaje personalizate |
| Pydantic | Python | Type hints, validarea automată a modelului |
| Zod | TypeScript | Type inference, tipizare strictă |
| javax.validation | Java | Bean Validation, @NotNull, @Size, @Pattern |
| FluentValidation | .NET | Fluent API, rulesets, reguli condiționale |
White-list (lista albă) — stabiliți ce date sunt permise, tot restul este respins. Black-list — stabiliți ce date sunt interzise, tot restul este permis. White-list este întotdeauna mai sigură: știți exact ce date vor trece. Black-list necesită anticiparea tuturor atacurilor posibile, ceea ce este imposibil. Exemplu: la verificarea vârstei folosiți white-list (doar numere de la 18 la 120), nu black-list (interzicerea „0”, „-1”, „999999”).
Expresiile regulate sunt un instrument eficient pentru validarea de format, dar pot fi sursa atacurilor ReDoS (Regular Expression Denial of Service). Unele modele (de exemplu, (a+)+b) provoacă backtracking catastrofal pe șiruri lungi, încărcând complet CPU-ul serverului. Folosiți biblioteci regex verificate și limitați lungimea șirului înainte de aplicarea expresiei regulate. Pentru cazuri complexe (email, URL) folosiți parserele incorporate ale limbajelor, nu expresii regulate proprii.
Chiar și dezvoltatorii experimentați fac greșeli la implementarea validării. Cele mai frecvente: validarea doar pe client, reguli prea stricte (parola „Must contain uppercase, lowercase, digit, special char, >= 12 chars, must not repeat characters”), mesaje de eroare neinformative ("Error: invalid input") și ignorarea cazurilor-limită (spații la început/sfârșit, caractere Unicode, șiruri vide). Fiecare dintre aceste greșeli înrăutățește UX și poate reduce conversia formularelor.
if (value) nu distinge șirul vid de zero, false sau „0”Cea mai bună practică — un sistem centralizat de validare acoperit de teste unitare. Fiecare regulă trebuie testată separat: valori-limită, date corecte, atacuri tipice (încercări SQLi, XSS-payloads, șiruri foarte lungi). Testele de regresie pentru validare previn slăbirea accidentală a regulilor la refactorizare. Folosiți property-based testing (QuickCheck, fast-check) pentru generarea de date aleatorii și verificarea că validarea nu cade cu excepție.
Întrebări frecvente
Validarea respinge datele incorecte, iar sanitizarea le curăță. De exemplu, la introducerea textului HTML, validarea verifică lungimea maximă, iar sanitizarea elimină tag-urile script prin DOMPurify. Ambele procese sunt obligatorii: validarea — pentru controlul formatului, sanitizarea — pentru securitatea ieșirii.
Nu, niciodată. Validarea pe client este ușor de ocolit prin interceptarea și modificarea cererilor. Folosiți instrumente precum Burp Suite sau pur și simplu curl. Validarea pe server este singura modalitate fiabilă de a proteja sistemul. Validarea pe client servește doar la îmbunătățirea experienței utilizatorului.
Verificați tipul MIME (nu doar extensia), dimensiunea fișierului, semnătura (octeții magici de la începutul fișierului) prin file signature validation. Nu vă bazați niciodată pe extensie — redenumiți fișierul la salvare. Pentru imagini, transcodați-le cu o bibliotecă server-side (ImageMagick, Sharp), ceea ce elimină codul incorporat din datele EXIF.
ReDoS (Regular Expression Denial of Service) — un atac în care atacatorul trimite un șir special construit care provoacă backtracking catastrofal în expresia regulată. Drept rezultat, CPU-ul serverului este încărcat la 100%, iar răspunsul nu este generat. Protecția: limitarea lungimii șirului, timeout pentru regex, folosirea unor modele verificate.
Da, dacă datele sunt afișate în WebView sau folosite în context HTML. Dacă backend-ul este compromis, datele pot conține cod malițios. Validați și sanitați orice date afișate utilizatorului, indiferent de sursă. În aplicațiile mobile acest lucru este deosebit de important pentru componentele hibride.
Concluzii
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.
Citiți și