© 2026 Laravel

Input Validation – Nền tảng bảo mật backend

3 phút đọc 31 lượt xem

#Nguyên tắc cốt lõi

👉 Never trust user input (Không bao giờ tin dữ liệu từ bên ngoài)

Nguồn input nguy hiểm:

  • $_GET, $_POST
  • API request
  • File upload
  • Header
  • Cookie

#Bad Example (Anti-pattern)

$name = $_POST['name'];
$email = $_POST['email'];
$age = $_POST['age'];

$user = new User($name, $email, $age);

Vấn đề

  • Không validate
  • Có thể inject data xấu
  • Phá vỡ data integrity

#Good Example (Best Practice)

#1. Validate email

$email = filter_var($input['email'] ?? '', FILTER_VALIDATE_EMAIL);
if ($email === false) {
    throw new ValidationException(['email' => 'Invalid email']);
}

#2. Validate string

$name = trim($input['name'] ?? '');
if ($name === '' || mb_strlen($name) > 100) {
    throw new ValidationException(['name' => 'Invalid name']);
}

#3. Validate integer

$age = filter_var($input['age'] ?? null, FILTER_VALIDATE_INT, [
    'options' => ['min_range' => 1, 'max_range' => 150]
]);

#4. Whitelist dynamic input

$allowed = ['id', 'name', 'price'];
$sort = in_array($input['sort'] ?? '', $allowed, true) ? $input['sort'] : 'id';

#5. Pagination safe

$page = max(1, (int) ($input['page'] ?? 1));

#Giải thích sâu

#1. Validation vs Sanitization

  • Validation: kiểm tra đúng/sai
  • Sanitization: làm sạch dữ liệu

👉 Luôn validate trước

#2. Whitelist > Blacklist

Blacklist

if ($input !== 'DROP TABLE')

Whitelist

in_array($input, ['id', 'name'])

#3. Boundary validation

👉 Validate ở mọi boundary:

  • Controller
  • Service
  • Domain

#4. Type safety

(int) 'abc' // 0 → bug

👉 filter_var an toàn hơn

#5. Defense in depth

👉 Không chỉ validate frontend 👉 Backend luôn phải validate lại

#Tips & Tricks (Senior level)

#1. Centralize validation

👉 Tạo Request DTO / Validator class

#2. Laravel FormRequest

$request->validate([
    'email' => 'required|email',
]);

#3. Escape output (XSS)

htmlspecialchars($input, ENT_QUOTES);

#4. SQL Injection

👉 Luôn dùng prepared statement

#5. Validate nested data

👉 JSON, array cần validate sâu

#Interview Questions

1. Tại sao phải validate input?

Summary:

  • Để bảo mật

Deep: Ngăn SQL injection, XSS, đảm bảo data integrity

2. Validation vs Sanitization?

Summary:

  • Validation: kiểm tra
  • Sanitization: làm sạch

Deep: Phải validate trước khi sanitize

3. Whitelist vs Blacklist?

Summary:

  • Whitelist an toàn hơn

Deep: Blacklist không thể cover hết case xấu

4. filter_var dùng khi nào?

Summary:

  • Validate type

Deep: Email, int, url

5. Có cần validate frontend không?

Summary:

  • Có nhưng chưa đủ

Deep: Backend vẫn phải validate lại

#Kết luận

👉 Input validation là nền tảng bảo mật

Nếu bỏ qua → hệ thống sẽ bị khai thác

👉 Luôn:

  • Validate
  • Whitelist
  • Type check
  • Escape output