Dễ PHP

Chống SQL Injection Trong PHP - Đừng Để Dính Bẫy

Học mấy kỹ thuật quan trọng để bảo vệ ứng dụng PHP khỏi mấy đòn SQL injection.

23 Th06, 2026 2 phút 1,019 Lượt xem 5 Khối code
Sơ đồ
flowchart TD A["Unsafe: input concatenated into SQL"] --> B["email = '' OR '1'='1'"] B --> C[DB returns ALL rows: auth bypass / data leak] D["Safe: input bound to a ? placeholder"] --> E[Driver sends the value as DATA, not SQL] E --> F[Query stays safe] style C fill:#fee2e2,stroke:#ef4444 style F fill:#dcfce7,stroke:#22c55e

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ớ

  1. Lúc nào cũng xài parameterized query
  2. Đừng bao giờ nối chuỗi input người dùng vào SQL
  3. Xài ORM/Query builder khi có thể
  4. Validate và sanitize input đàng hoàng
  5. Á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 tương tác

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í.

Ngôn ngữPHP

Code khởi tạo

php
$email = $_GET['email'];
$sql = "SELECT * FROM users WHERE email = '$email'";
$user = $pdo->query($sql)->fetch();

Lời giải của bạn

Lời giải · php
$email = $_GET['email'];
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = ?');
$stmt->execute([$email]);
$user = $stmt->fetch();

Cùng chủ đề PHP