SQL Injection là một loại tấn công mạng phổ biến, trong đó kẻ tấn công chỉnh sửa các câu lệnh SQL để truy cập trái phép vào cơ sở dữ liệu. Một phương pháp thường gặp là cố tình điền các câu lệnh SQL vào biểu mẫu (form). Khi hệ thống backend nhận được dữ liệu này, nó có thể tạo ra một câu lệnh SQL không mong muốn, cho phép kẻ tấn công thực thi lệnh đó trên cơ sở dữ liệu.
Ví dụ, nếu trường mật khẩu được điền với giá trị ' OR 1 = 1 --, chuỗi truy vấn được tạo ra sẽ như sau:
1queryStr = """ SELECT * FROM users WHERE username = 'Jack' AND password = '' OR 1= 1 --';"Vì điều kiện username = 'Jack' AND password = '' OR 1 = 1 luôn đúng, nên kẻ tấn công có thể đăng nhập mà không cần mật khẩu.
1. Escape (thoát) tham số đầu vào
Một cách để phòng chống SQL Injection là sử dụng biểu thức chính quy (regular expression) để kiểm tra các tham số đầu vào của người dùng. Nếu phát hiện đầu vào chứa các từ khóa SQL, chúng sẽ được thay thế bằng ký tự hợp lệ. Tuy nhiên, phương pháp này có nhược điểm là phải cập nhật các quy tắc biểu thức chính quy mỗi khi có từ khóa SQL mới, và không thể bao phủ hết mọi trường hợp.
2. Tham số hóa truy vấn (Query Parameterization)
Tham số hóa truy vấn là cách an toàn nhất để phòng chống SQL Injection. Phương pháp này sử dụng các placeholder trong cú pháp SQL để xử lý tham số tách biệt với câu lệnh SQL. Ví dụ:
1SELECT * FROM users WHERE username = $1 AND password = $2;Ở một số ngôn ngữ lập trình, câu lệnh SQL được biên dịch trước, sau đó các tham số mới được truyền vào để thực thi, giúp ngăn chặn tấn công SQL Injection hiệu quả.
3. Sử dụng ORM (Object Relational Mapping)
Sử dụng các công cụ ORM thay vì viết câu lệnh SQL thuần (raw SQL) có thể giúp tránh hoàn toàn các vấn đề về SQL Injection.
1const user = await User.findOne({
2 where: { username: username, password: password }
3});Tóm tắt: