Mối nguy hiểm của lỗi SQL Injection trong lập trình PHP MySQL

17:16 04/02/2025

SQL Injection là một trong những lỗ hổng bảo mật nghiêm trọng nhất trong lập trình web, đặc biệt khi sử dụng PHP và MySQL. Lỗ hổng này xảy ra khi ứng dụng không kiểm soát chặt chẽ dữ liệu đầu vào từ người dùng, dẫn đến việc kẻ tấn công có thể chèn các câu lệnh SQL độc hại vào truy vấn cơ sở dữ liệu.

Mối nguy hiểm của SQL Injection

  • Rò rỉ dữ liệu: Kẻ tấn công có thể truy vấn toàn bộ dữ liệu từ bảng cơ sở dữ liệu, bao gồm thông tin nhạy cảm như tài khoản, mật khẩu, email, v.v.
  • Thay đổi hoặc xóa dữ liệu: Hacker có thể sửa đổi, chèn hoặc xóa dữ liệu trong database, gây mất mát dữ liệu nghiêm trọng.
  • Chiếm quyền điều khiển hệ thống: Nếu database có quyền cao (admin), hacker có thể thực thi các lệnh nguy hiểm như tạo tài khoản quản trị hoặc kiểm soát toàn bộ hệ thống.
  • Làm sập hệ thống: Một số cuộc tấn công SQL Injection có thể làm gián đoạn hoặc tê liệt toàn bộ hệ thống bằng cách thực thi các lệnh gây lỗi.

Ví dụ về SQL Injection:

// Truy vấn không an toàn

$username = $_POST[‘username’];

$password = $_POST[‘password’];

$sql = “SELECT * FROM users WHERE username = ‘$username’ AND password = ‘$password'”;

Nếu kẻ tấn công nhập ‘ OR ‘1’=’1 vào cả username và password, câu truy vấn sẽ trở thành:

SELECT * FROM users WHERE username = ” OR ‘1’=’1′ AND password = ” OR ‘1’=’1′;

Kết quả: Truy vấn luôn đúng, và kẻ tấn công có thể truy cập trái phép.

Nguyên nhân gây ra SQL Injection trong PHP

  • Không kiểm tra đầu vào từ người dùng: Các dữ liệu nhập từ form, URL, hoặc API không được lọc hoặc xác thực trước khi sử dụng.
  • Sử dụng truy vấn SQL trực tiếp: Việc ghép chuỗi dữ liệu người dùng trực tiếp vào câu truy vấn mà không sử dụng các công cụ bảo vệ.
  • Thiếu chuẩn bị câu truy vấn an toàn: Không sử dụng prepared statements hoặc stored procedures.
  • Không mã hóa đặc biệt các ký tự nguy hiểm: Dữ liệu chứa ký tự đặc biệt như ‘, “, hoặc — có thể gây lỗi truy vấn.

Giải pháp phòng tránh SQL Injection trong PHP

Để bảo vệ ứng dụng PHP khỏi SQL Injection, bạn cần áp dụng các giải pháp sau:

  • Sử dụng Prepared Statements và Parameterized Queries: Prepared Statements tự động xử lý và mã hóa dữ liệu đầu vào, ngăn chặn việc chèn mã độc vào câu truy vấn SQL.

Ví dụ:

// Sử dụng PDO với prepared statements

$pdo = new PDO(‘mysql:host=localhost;dbname=test’, ‘root’, ”);

$stmt = $pdo->prepare(“SELECT * FROM users WHERE username = :username AND password = :password”);

$stmt->bindParam(‘:username’, $username);

$stmt->bindParam(‘:password’, $password);

$stmt->execute();

$result = $stmt->fetchAll();

  • Kiểm tra và lọc đầu vào từ người dùng: Xác thực và kiểm tra dữ liệu trước khi xử lý.

Ví dụ:

    • Số: sử dụng is_numeric().
    • Email: sử dụng filter_var($email, FILTER_VALIDATE_EMAIL).
    • Chuỗi: sử dụng htmlspecialchars() hoặc strip_tags() để loại bỏ ký tự HTML không mong muốn.

Ví dụ:

$username = htmlspecialchars($_POST[‘username’]);

  • Sử dụng các thư viện ORM: ORM (Object-Relational Mapping) như Eloquent (Laravel), Doctrine, hoặc RedBeanPHP giúp bạn làm việc với cơ sở dữ liệu mà không cần viết truy vấn SQL trực tiếp, giảm nguy cơ SQL Injection.

Ví dụ với Eloquent (Laravel):

$user = User::where(‘username’, $username)->first();

  • Hạn chế quyền trong cơ sở dữ liệu: Chỉ cấp quyền tối thiểu cần thiết cho tài khoản kết nối cơ sở dữ liệu (ví dụ: chỉ SELECT, INSERT, UPDATE khi cần thiết). Sử dụng các tài khoản khác nhau cho các mục đích khác nhau (đọc, ghi, quản trị).

Lỗ hổng SQL Injection có thể gây ra hậu quả nghiêm trọng như mất dữ liệu, lộ thông tin người dùng, thậm chí mất quyền kiểm soát hệ thống. Việc sử dụng Prepared Statements, lọc đầu vào và cấp quyền database hợp lý là những biện pháp quan trọng mà các developer cần phải chú ý để bảo vệ ứng dụng PHP/MySQL khỏi SQL Injection.

Giảng viên Trần Bá Hộ
Bộ môn Công nghệ thông tin
FPT Polytechnic TP HCM

Hỗ trợ tư vấn và giải đáp thông tin tuyển sinh FPT Polytechnic

Cùng chuyên mục

Đăng ký nhập học tại FPT Polytechnic 2026

  • Max. file size: 50 MB.
  • Max. file size: 50 MB.
  • Max. file size: 50 MB.