SQL Injection Protection là quá trình bảo vệ ứng dụng khỏi các cuộc tấn công SQL Injection. SQL Injection là một kỹ thuật tấn công phổ biến, trong đó kẻ tấn công cố gắng chèn (inject) các đoạn mã SQL độc hại vào các câu lệnh SQL thông qua các input từ phía người dùng để kiểm soát hoặc thao tác dữ liệu trong cơ sở dữ liệu.
Mục tiêu của SQL Injection:
Truy xuất trái phép: Kẻ tấn công có thể xem hoặc sửa đổi dữ liệu mà họ không có quyền truy cập.
Thao túng dữ liệu: Họ có thể thay đổi, xóa dữ liệu hoặc tạo dữ liệu mới.
Chiếm quyền điều khiển hệ thống: Trong một số trường hợp nghiêm trọng, kẻ tấn công có thể điều khiển hoàn toàn hệ thống máy chủ.
Ví dụ về SQL Injection:
Giả sử có một truy vấn SQL cơ bản trong PHP như sau:
php
$sql = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'";
Kẻ tấn công có thể chèn vào trường username đầu vào như sau:
sql
' OR '1'='1
Truy vấn sẽ trở thành:
sql
SELECT * FROM users WHERE username = '' OR '1'='1' AND password = '';
Điều này dẫn đến việc truy vấn luôn trả về true và kẻ tấn công có thể đăng nhập mà không cần biết mật khẩu.
Các biện pháp bảo vệ SQL Injection:
1. Sử dụng Prepared Statements và Parameterized Queries
Prepared statements cho phép bạn tách phần mã SQL và dữ liệu đầu vào, ngăn không cho đầu vào của người dùng được hiểu như mã SQL. Đây là cách bảo vệ SQL Injection hiệu quả nhất.
Ví dụ trong PHP với PDO:
php
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password"); $stmt->execute(['username' => $username, 'password' => $password]);
Ở đây, :username và :password được thay thế bằng giá trị người dùng cung cấp, nhưng chúng không thể bị can thiệp vào dưới dạng mã SQL.
2. Sử dụng ORM (Object-Relational Mapping)
ORM như Eloquent (Laravel) hoặc TypeORM (NestJS) cho phép bạn làm việc với cơ sở dữ liệu bằng cách sử dụng các đối tượng và phương thức, thay vì viết trực tiếp các truy vấn SQL. ORM thường bảo vệ mặc định khỏi SQL Injection bằng cách xử lý các tham số một cách an toàn.
3. Escape các đầu vào (Escaping Input)
Trong một số ngữ cảnh không thể dùng prepared statements, bạn cần escape các đầu vào bằng cách sử dụng các hàm bảo vệ như:
mysqli_real_escape_string() trong PHP
pg_escape_string() cho PostgreSQL
Các hàm này sẽ thêm các ký tự thoát (escape) vào các chuỗi đầu vào để ngăn chúng trở thành phần của câu lệnh SQL.
4. Validation và Sanitization
Validation: Kiểm tra xem đầu vào của người dùng có tuân theo định dạng mong muốn không (ví dụ, email hợp lệ, số hợp lệ).
Sanitization: Loại bỏ hoặc chuyển đổi các ký tự không mong muốn từ input của người dùng.
Ví dụ, nếu một trường yêu cầu là số nguyên, bạn nên xác thực rằng giá trị nhập vào là số (dùng filter_var() trong PHP).
5. Giới hạn quyền của tài khoản database
Không sử dụng tài khoản có quyền admin để thực thi các truy vấn cơ sở dữ liệu từ ứng dụng.
Tạo các tài khoản với quyền hạn tối thiểu cần thiết cho các hoạt động cụ thể (chỉ đọc, chỉ ghi…).
6. Sử dụng Web Application Firewall (WAF)
WAF có thể phát hiện và chặn các yêu cầu độc hại trước khi chúng đến được máy chủ của bạn, giúp bảo vệ khỏi các cuộc tấn công SQL Injection.
7. Kiểm tra thường xuyên
Thực hiện kiểm tra bảo mật thường xuyên và đánh giá các lỗ hổng thông qua các công cụ như OWASP ZAP, Burp Suite để phát hiện các điểm yếu tiềm ẩn.
Kết luận:
SQL Injection là một trong những lỗ hổng bảo mật nghiêm trọng nhất, nhưng hoàn toàn có thể phòng tránh nếu bạn tuân thủ các biện pháp bảo vệ như sử dụng prepared statements, ORM, escaping input và kiểm tra quyền hạn. Đảm bảo rằng tất cả các tương tác với cơ sở dữ liệu đều được bảo mật để tránh việc bị khai thác bởi các cuộc tấn công injection.

Dương Trần Hà, hiện mình đang là kỹ công nghệ phần mềm và cũng là giám đốc thành lập công ty DTH Solutions. Mình có nhiều năm kinh nghiệm, kiến thức chuyên môn lập trình, nodejs, nestjs, laravel, yii2, reactjs, nextjs. Mình đã phát triển rất nhiều dự án thực tế cho doanh nghiệp, cơ quan. Mình đã đạt được một số thành công nhỏ, đồng thời mình vẫn đang tiếp tục học tập để trau dồi kiến thức mỗi ngày. Mình rất yêu thích công nghệ, đam mê chia sẻ những kiến thức, thông tin hữu ích cho mọi người.