Chống SQL Injection Trong PHP
SQL injection là một trong mấy lỗ hổng bảo mật nguy hiểm nhất. Đây là cách né nó.
❌ Đừng Bao Giờ Làm Vầy
// CODE DÍNH BẪY - ĐỪNG XÀI!
$userId = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $userId";
$result = mysqli_query($conn, $query);
Hacker chỉ cần nhét vào: ?id=1 OR 1=1 là lấy sạch hết dữ liệu!
✅ Xài Prepared Statements (MySQLi)
$userId = $_GET['id'];
$stmt = $conn->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $userId);
$stmt->execute();
$result = $stmt->get_result();
✅ Xài PDO Với Prepared Statements
$userId = $_GET['id'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute(['id' => $userId]);
$user = $stmt->fetch();
✅ Laravel Query Builder (Tự Động Bảo Vệ)
$userId = request('id');
$user = DB::table('users')->where('id', $userId)->first();
// hoặc
$user = User::find($userId);
Cẩn Thận: Raw Query
Ngay cả xài Laravel cũng phải cẩn thận với raw query:
// ❌ Vẫn dính bẫy như thường
DB::select("SELECT * FROM users WHERE id = " . $userId);
// ✅ Xài binding
DB::select("SELECT * FROM users WHERE id = ?", [$userId]);
Mấy Best Practice Nên Nhớ
- Lúc nào cũng xài parameterized query
- Đừng bao giờ nối chuỗi input người dùng vào SQL
- Xài ORM/Query builder khi có thể
- Validate và sanitize input đàng hoàng
- Áp dụng nguyên tắc quyền hạn tối thiểu cho user database
Tác Động Thực Tế
Năm 2023, tấn công SQL injection chiếm tới 30% tổng số vụ xâm nhập web application.
Đừng để mình trở thành con số thống kê tiếp theo - bảo vệ app của mình đàng hoàng!
Thử thách
Luyện tập ngay điều vừa học. Viết lời giải, mở gợi ý nếu bí.
Code khởi tạo
$email = $_GET['email'];
$sql = "SELECT * FROM users WHERE email = '$email'";
$user = $pdo->query($sql)->fetch();
Lời giải của bạn
$email = $_GET['email'];
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();

