ducdev
Bài viết

Bảo mật PHP — 7 lỗ hổng phổ biến và cách phòng chống

SQL Injection, XSS, CSRF là những lỗ hổng bảo mật phổ biến nhất trong ứng dụng PHP. Bài viết giải thích từng loại tấn công và cách phòng chống hiệu quả.

a
admin
04/06/2026 · 2 phút đọc · 8 lượt xem
Chia sẻ
Bảo mật PHP — 7 lỗ hổng phổ biến và cách phòng chống

Bảo mật web không phải là tính năng — đó là yêu cầu cơ bản. Nhiều lập trình viên PHP chỉ chú trọng vào tính năng mà bỏ qua bảo mật, để lại những lỗ hổng nghiêm trọng.

1. SQL Injection

// LỖ HỔNG — ĐỪNG LÀM THẾ NÀY
$query = "SELECT * FROM users WHERE username = '" . $_GET['user'] . "'";
// Input: ' OR '1'='1 → trả về toàn bộ users!

// ĐÚNG — prepared statement
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_GET['user']]);

2. Cross-Site Scripting (XSS)

// LỖ HỔNG
echo "Xin chào, " . $_GET['name'];

// AN TOÀN — escape output
echo "Xin chào, " . htmlspecialchars($_GET['name'], ENT_QUOTES, 'UTF-8');

3. CSRF

$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

// Kiểm tra khi xử lý form
if (!hash_equals($_SESSION['csrf_token'], $_POST['csrf_token'] ?? '')) {
    die("CSRF token không hợp lệ!");
}

4. Mật khẩu lưu không an toàn

// LỖ HỔNG
$password = md5($_POST['password']); // CỰC KỲ NGUY HIỂM

// ĐÚNG
$hashed = password_hash($_POST['password'], PASSWORD_BCRYPT);
if (password_verify($input_password, $hashed_from_db)) {
    // Đăng nhập thành công
}

5. File Upload không kiểm tra

$allowed_types = ['image/jpeg', 'image/png', 'image/webp'];
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['file']['tmp_name']);

if (!in_array($mime, $allowed_types)) {
    die("Loại file không được phép!");
}

// Tên file ngẫu nhiên, không giữ tên gốc
$filename = bin2hex(random_bytes(16)) . '.jpg';
move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $filename);

6. Lộ thông tin nhạy cảm

  • Tắt display_errors trên production
  • Không commit file .env chứa mật khẩu lên git
  • Không để thư mục .git có thể truy cập từ web

7. Session Hijacking

session_start();
session_regenerate_id(true); // sau khi đăng nhập

$_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
if ($_SESSION['ip'] !== $_SERVER['REMOTE_ADDR']) {
    session_destroy();
    header('Location: /login');
    exit;
}
Bảo mật không phải là thứ bạn thêm vào sau khi xây xong ứng dụng. Nó phải được tích hợp vào từng dòng code từ đầu.

Kết luận

Bảy lỗ hổng trên — SQL Injection, XSS, CSRF, mật khẩu yếu, file upload nguy hiểm, lộ thông tin và session hijacking — chiếm phần lớn các vụ tấn công web thực tế. Áp dụng các biện pháp phòng chống trong bài là bước đầu tiên để xây dựng ứng dụng PHP đáng tin cậy.

#PHP #bao mat #SQL Injection #XSS #CSRF
a
Tác giả
admin

Lập trình viên, yêu thích chia sẻ kiến thức về công nghệ và phát triển phần mềm.

Bình luận

Chưa có bình luận. Hãy là người đầu tiên!

Để lại bình luận

Bình luận sẽ được duyệt trước khi hiển thị.