JavaRush /Курси /Модуль 5. Spring /Навіщо потрібна валідація і які види валідації існують

Навіщо потрібна валідація і які види валідації існують

Модуль 5. Spring
Рівень 8 , Лекція 0
Відкрита

Припустимо, ви створюєте API для реєстрації користувачів. Користувач надсилає дані, і ви записуєте їх у базу даних — звучить просто, правда? Але що, якщо користувач надсилає дивні символи замість ім'я? Або забуває вказати обов'язкове поле email? Або вік виявляється від'ємним? Усе це може призвести до багів, порушення логіки роботи додатка або, що гірше, до вразливостей.

Валідація — це процес перевірки на коректність даних, які надходять у ваш додаток. Вона гарантує, що дані відповідають заданим критеріям: є повними, коректними та безпечними.

Без валідації:

  • Ваші дані в базі можуть бути «брудними» (некоректними або неповними).
  • Логіка додатка може працювати неправильно.
  • Ваш додаток може стати об'єктом атак (наприклад, SQL-ін'єкцій або XSS).

Проблеми, які вирішує валідація

  1. Некоректний ввод даних:
    • Поля залишаються пустими, коли вони обов'язкові.
    • Вводяться недопустимі формати (наприклад, "123abc" у поле для email).
  2. Захист від атак:
    • Захист від шкідливого вводу, наприклад SQL-ін'єкцій.
  3. Дотримання бізнес-логіки:
    • Наприклад, дата завершення події не може бути раніше дати її початку.
  4. Підвищення якості даних:
    • Чим краща валідація, тим менше проблем з обробкою даних у майбутньому.

Основні види валідації

1. Клієнтська валідація

Клієнтська валідація виконується на стороні клієнта (наприклад, у браузері за допомогою JavaScript). Вона допомагає знаходити помилки майже миттєво, перш ніж запит навіть дійде до сервера.

Приклад клієнтської валідації:


<form>
    <label for="email">Email:</label>
    <input type="email" id="email" name="email" required>
    <button type="submit">Відправити</button>
</form>

Коли користувач намагається ввести текст, який не відповідає формату email, браузер автоматично покаже повідомлення про помилку.

Проблема: клієнтську валідацію легко обійти (наприклад, за допомогою інструментів для відправки прямих HTTP-запитів), тому її не можна вважати надійною.

2. Серверна валідація

Серверна валідація відбувається на сервері, після отримання даних від клієнта. Вона обов'язкова, оскільки сервер має захищати себе від некоректних і шкідливих даних, незалежно від клієнта.

Приклад валідації на сервері (на Java):


public String validateEmail(String email) {
    if (email == null || !email.contains("@")) {
        throw new IllegalArgumentException("Invalid email format");
    }
    return email;
}

3. Бізнес-валідація

Цей вид валідації забезпечує дотримання специфічної для вашого додатка бізнес-логіки. Наприклад:

  • Співробітник не може бути призначений на проєкт, якщо в нього немає відповідної кваліфікації.
  • Знижка на товар не може бути більше 50%, якщо товар у категорії "новинки".

Приклад:


if (discount > 50 && productCategory.equals("new")) {
    throw new BusinessRuleViolationException("Discount for new products cannot exceed 50%");
}

Інструменти та бібліотеки для валідації

Bean Validation API

У світі Java існує стандарт для валідації даних — Bean Validation API (JSR 380). Це потужна і гнучка бібліотека, яка дозволяє валідовувати дані за допомогою анотацій.

Приклад використання Bean Validation

Припустимо, у нас є клас User, і ми хочемо валідовувати його поля:


import javax.validation.constraints.*;

public class User {
    @NotNull(message = "Ім'я не повинно бути порожнім")
    private String name;

    @Email(message = "Некоректний формат email")
    private String email;

    @Min(value = 18, message = "Вік не може бути менше 18")
    private int age;

    // Гетери і сетери...
}

Як це працює:

  1. Анотація @NotNull перевіряє, що поле не порожнє.
  2. @Email перевіряє, що рядок відповідає формату email.
  3. @Min гарантує, що вік не буде менше 18 років.

При спробі збереження некоректного об'єкта в базу даних або передачі його в сервіс, буде кинуто виключення javax.validation.ConstraintViolationException, яке можна обробити в додатку.


Приклади з реального життя

1. Реєстрація користувача

Коли ви реєструєте користувача, ви не можете просто приймати будь-які дані. Ось приклад, де використовуються різні види валідації:

  • Клієнтська валідація: перевірка формату email і пароля через регулярні вирази.
  • Серверна валідація: перевірка, що email унікальний.
  • Бізнес-валідація: наприклад, не можна реєструватися, якщо користувачу менше 18 років.

2. Інтернет-магазин

У сценарії оформлення замовлення:

  • Клієнтська валідація: перевірте, чи всі обов'язкові поля заповнені.
  • Серверна валідація: переконайтеся, що надана платіжна картка дійсна (через API).
  • Бізнес-валідація: переконайтеся, що замовлення не може бути оформлене, якщо обраний товар більше не доступний.

Висновки

Реалізовувати валідацію на всіх рівнях (клієнт, сервер, бізнес-логіка) — це не просто хороша практика, а необхідність. Наприклад, якщо ви покладаєтеся тільки на клієнтську валідацію, то будь-який "хакер-самоучка" зможе відправити запит напряму і обійти перевірки. Якщо ігнорувати бізнес-валідацію, то ви ризикуєте порушити правила і логіку вашого додатка, що може призвести не тільки до багів, але й до фінансових збитків.

Далі ми зануримося в використання Bean Validation API і анотацій, включаючи такі, як @NotNull, @Min, @Max, @Size та інші. А потім навчимося впроваджувати їх у наші контролери і REST API. Готуйтесь — все тільки починається!

Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ