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_errorstrên production - Không commit file
.envchứa mật khẩu lên git - Không để thư mục
.gitcó 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.
Chưa có bình luận. Hãy là người đầu tiên!