Валидација улазних података је процес провере долазећих података на усклађеност са очекиваним форматом, типом и опсегом вредности пре њихове обраде у апликацији. Према OWASP Input Validation Cheat Sheet (2025), недостатак валидације је основни узрок већине критичних рањивости. Провера долазећих података је прва линија одбране која спречава улазак неисправних или злонамерних података у систем.
Главно
Валидација улазних података је провера да подаци који стижу у апликацију од корисника, спољног сервиса или друге компоненте одговарају очекиваним критеријумима. Ови критеријуми укључују тип података (ниска, број, датум), формат (имејл, URL, телефон), опсег вредности (старост од 18 до 120), дужину (лозинка од 8 до 128 знакова) и дозвољене знакове (само латиница, цифре, цртица). Без валидације апликација може обрадити податке који ће проузроковати грешке извршавања, оштећење података или безбедносне рањивости.
Недостатак валидације улазних података је основни узрок рањивости као што су SQL Injection, XSS, Command Injection, Path Traversal и Buffer Overflow. Према MITRE CWE (2025), CWE-20 (Improper Input Validation) заузима друго место на ранг-листи најопаснијих софтверских грешака. Валидација је прва линија одбране у моделу безбедности Defense in Depth: одсеца неисправне податке пре него што стигну до других компоненти система.
Валидација одбија податке који не испуњавају критеријуме. Санитизација (чишћење) мења податке, уклањајући или енкодујући опасне делове. На пример, при уносу HTML садржаја валидација може проверити дужину текста, а санитизација уклонити script ознаке преко библиотеке HTML Purifier или DOMPurify. Санитизација не замењује валидацију: оне раде у пару. Валидација је политика „дозвољено/забрањено“, санитизација је „очишћено пре употребе“.
Валидација се класификује по дубини провере. Форматна валидација је најједноставнија и најбржа, а пословна валидација је најсложенија и највише зависи од контекста. Сва три нивоа треба примењивати сукцесивно: прво формат, затим семантика, потом пословна логика. Прескакање било ког нивоа може довести до неисправног рада система или рањивости.
| Ниво | Шта проверава | Пример |
|---|---|---|
| Форматна | Тип података, дужина, регуларни израз | Имејл садржи @, дужина 5-100 |
| Семантичка | Логичка исправност вредности | Датум рођења није у будућности |
| Пословна валидација | Усклађеност са пословним правилима | Износ трансфера не прелази стање |
Провера типа података, величине, формата и дозвољених знакова. Реализује се кроз регуларне изразе, уграђене типове језика и библиотеке за валидацију. Примери: провера UUID (формат 8-4-4-4-12 хексадецималних цифара), провера броја телефона (само цифре, + на почетку, од 7 до 15 знакова), провера целог броја (вредност у опсегу Integer.MIN_VALUE — Integer.MAX_VALUE). Форматна валидација је минимално потребан ниво за свако поље уноса.
Провера логичке исправности података у контексту предметне области. На пример: датум почетка није касније од датума завршетка, старост у разумним границама за систем, координате на територији услуживања. Семантичка валидација захтева разумевање пословног контекста и не може се извршити само на основу формата. Пример: поље „број карата“ може проћи форматну проверу (цео број, > 0), али семантички не сме прелазити број слободних места.
Најсложенији ниво — провера података на усклађеност са пословним правилима апликације. Примери: корисник не може обрисати јединог администратора, износ поруџбине не прелази кредитни лимит, производ се може поручити само ако је на стању. Пословна валидација често захтева упите у базу података или спољне сервисе и извршава се после форматних и семантичких провера. Грешке пословне валидације су најчешћи разлози незадовољства корисника.
Клијентска валидација (у прегледачу или мобилној апликацији) потребна је за удобност корисника: тренутна повратна информација без слања података на сервер. Међутим, серверска валидација је једина поуздана, јер се клијентски код увек може заобићи. Пошаљите захтеве кроз развојне алате, Postman или прокси (Burp Suite) — и клијентска валидација престаје да постоји. Према PortSwigger Research (2025), више од 90% тестираних веб апликација ослања се искључиво на клијентску валидацију за бар једно поље.
Клијентска валидација може искључивати дугме за слање, истицати грешке, приказивати савете. Серверска валидација је обавезна провера сваког параметра, чак и ако га је клијент већ проверио. Удвостручавање валидације на оба нивоа је стандардна пракса. Сервер треба да проверава податке као да клијент не постоји. То гарантује заштиту од измењених захтева, аутоматизованих напада и злонамерних клијената.
На вебу — HTML5 атрибути (required, pattern, min/max, type="email") и JavaScript. У мобилним апликацијама — изворни валидатори текст поља (InputFilter у Android-у, textField(:shouldChangeCharactersIn:) у iOS-у). React Hook Form и Formik за React, Vuelidate за Vue, Angular Reactive Forms — популарне библиотеке за клијентску валидацију. Све подржавају прилагођена правила и асинхрону валидацију (провера јединствености логова на серверу).
// Пример серверске валидације на Express-у са 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 — већ проверени и безбедни подаци
const user = await User.create(value);
res.status(201).json(user);
});
Мобилне апликације постављају посебне захтеве за валидацију података. Екран је мањи — грешке морају бити сажете, тастатура контекстуална (нумеричка за унос бројева), а провера асинхрона, да не блокира интерфејс. Изворне платформе пружају уграђене механизме валидације које треба користити подразумевано. Material Design Guidelines за Android и Human Interface Guidelines за iOS садрже детаљне препоруке за приказ грешака валидације.
Jetpack Compose нуди декларативни приступ валидацији кроз управљање стањем. Свако поље уноса повезано је са стањем (MutableState), а грешка се израчунава на основу тренутне вредности. Библиотека Compose Validator поједностављује креирање правила: required, email, min/max length, pattern. Валидација се покреће при промени текста (onValueChange) или при покушају слања форме. Препоручује се приказ грешке тек после првог слања или након што је корисник завршио унос (debounce 300-500ms).
SwiftUI нема уграђени механизам валидације форми, али омогућава једноставну имплементацију кроз Combine и property wrappers. Користите @State за вредност поља и израчунато својство за грешку. Фрејмворк ValidatedPropertyKit пружа готове декораторе: @Validated().email(), @Validated().range(18...120). Препорука iOS-а — користите типове тастатуре (UIKeyboardType.emailAddress, .numberPad) и auto-capitalization да смањите број грешака на нивоу уноса.
Flutter пружа класу Form и TextFormField са уграђеном валидацијом кроз validator повратни позив. Свако поље враћа грешку као ниску или null ако су подаци исправни. FormState.validate() покреће проверу свих поља форме. Пакет reactive_forms за сложене случајеве: прилагођени валидатори, асинхрона провера, динамичка правила. Flutter Web и мобилна верзија користе исти API, што поједностављује одржавање.
// Пример валидације форме на 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'),
),
],
),
)
Савремени фрејмворци пружају уграђене валидаторе који покривају 80% потреба. Преосталих 20% захтева прилагођена правила, регуларне изразе или композицију постојећих. Кључни принцип — валидација треба да буде декларативна како би се лако читала, тестирала и одржавала. Избегавајте логику валидације развучену по контролерима и екранима — издвојите је у посебне класе или схеме.
| Алат | Платформа | Карактеристике |
|---|---|---|
| Joi | Node.js | Декларативне схеме, прилагођене поруке |
| Pydantic | Python | Type hints, аутоматска валидација модела |
| Zod | TypeScript | Type inference, строга типизација |
| javax.validation | Java | Bean Validation, @NotNull, @Size, @Pattern |
| FluentValidation | .NET | Fluent API, rulesets, условна правила |
White-list (бела листа) — одређујете који су подаци дозвољени, све остало се одбија. Black-list — одређујете који су подаци забрањени, све остало се пропушта. White-list је увек поузданија: тачно знате који подаци ће проћи. Black-list захтева предвиђање свих могућих напада, што је немогуће. Пример: при провери старости користите white-list (само бројеве од 18 до 120), а не black-list (забрану „0“, „-1“, „999999“).
Регуларни изрази су ефикасан алат за форматну валидацију, али могу бити извор ReDoS напада (Regular Expression Denial of Service). Неки обрасци (на пример, (a+)+b) доводе до катастрофалног бецктрацкинга на дугим нискама, потпуно оптерећујући процесор сервера. Користите проверене regex библиотеке и ограничите дужину ниске пре примене регуларног израза. За сложене случајеве (имејл, URL) користите уграђене парсере језика, а не самосталне регуларне изразе.
Чак и искусни програмери греше при имплементацији валидације. Најчешће: валидација само на клијенту, превише строга правила (лозинка „Must contain uppercase, lowercase, digit, special char, >= 12 chars, must not repeat characters“), неинформативне поруке о грешкама ("Error: invalid input") и игнорисање рубних случајева (размаци на почетку/крају, Unicode знакови, празне ниске). Свака од ових грешака погоршава UX и може смањити конверзију форми.
if (value) не разликује празну ниску од нуле, false или „0“Најбоља пракса — централизовани систем валидације покривен unit тестовима. Свако правило треба тестирати посебно: граничне вредности, исправни подаци, типични напади (SQLi покушаји, XSS payloads, веома дугачке ниске). Регресиони тестови валидације спречавају случајно слабљење правила при рефакторингу. Користите property-based тестирање (QuickCheck, fast-check) за генерисање насумичних података и проверу да валидација не пада са изузетком.
Често постављана питања
Валидација одбија неисправне податке, а санитизација их чисти. На пример, при уносу HTML текста валидација ће проверити максималну дужину, а санитизација уклонити script ознаке кроз DOMPurify. Оба процеса су обавезна: валидација — за форматну контролу, санитизација — за безбедност исписа.
Не, никада. Клијентска валидација се лако заобилази кроз пресретање и модификацију захтева. Користите алате попут Burp Suite-а или једноставно curl. Серверска валидација је једини поуздан начин заштите система. Клијентска валидација служи само за побољшање корисничког искуства.
Проверавајте MIME тип (не само екстензију), величину датотеке, потпис (магичне бајтове на почетку датотеке) кроз file signature validation. Никада не верујте екстензији — преименујте датотеку при чувању. За слике их транскодујте серверском библиотеком (ImageMagick, Sharp), што ће уклонити уграђени код из EXIF података.
ReDoS (Regular Expression Denial of Service) — напад у којем нападач шаље посебно конструисану ниску која изазива катастрофални бектрекинг у регуларном изразу. Као резултат, процесор сервера је оптерећен 100%, а одговор се не формира. Заштита: ограничавање дужине ниске, временска ограђења за regex, коришћење проверених образаца.
Да, ако се подаци приказују у WebView-у или користе у HTML контексту. Ако је бекенд компромитован, подаци могу садржати злонамерни код. Валидирајте и санитизујте све податке који се приказују кориснику, без обзира на извор. У мобилним апликацијама ово је посебно важно за хибридне компоненте.
Итог
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође