SQL Injection — an toàn cơ bản
SQL Injection xảy ra khi dữ liệu người dùng bị ghép trực tiếp vào câu lệnh SQL, cho phép kẻ tấn công đổi ý nghĩa truy vấn.
Cách lỗ hổng xuất hiện
Giả sử code ghép chuỗi: "SELECT * FROM users WHERE name = '" + input + "'".
Nếu người dùng nhập ' OR '1'='1, câu lệnh trở thành ... WHERE name = '' OR '1'='1' — trả về toàn bộ bảng.
Tệ hơn, nhập '; DROP TABLE users; -- có thể phá dữ liệu.
Cách phòng tránh
- Prepared statements / tham số hóa:
WHERE name = ?và truyền giá trị riêng. DBMS không bao giờ hiểu dữ liệu là mã lệnh. - Kiểm tra & giới hạn đầu vào, dùng ORM đúng cách.
- Nguyên tắc tối thiểu quyền: tài khoản app không nên có quyền DROP.
Bên phải là ví dụ an toàn minh họa: khi coi ' OR '1'='1 là *dữ liệu* (một cái tên), truy vấn trả về 0 dòng thay vì lộ dữ liệu.Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Cách lỗ hổng xuất hiện
Giả sử code ghép chuỗi: "SELECT * FROM users WHERE name = '" + input + "'".
Nếu người dùng nhập ' OR '1'='1, câu lệnh trở thành ... WHERE name = '' OR '1'='1' — trả về toàn bộ bảng.
Tệ hơn, nhập '; DROP TABLE users; -- có thể phá dữ liệu.
Cách phòng tránh
- Prepared statements / tham số hóa:
WHERE name = ?và truyền giá trị riêng. DBMS không bao giờ hiểu dữ liệu là mã lệnh. - Kiểm tra & giới hạn đầu vào, dùng ORM đúng cách.
- Nguyên tắc tối thiểu quyền: tài khoản app không nên có quyền DROP.
Bên phải là ví dụ an toàn minh họa: khi coi ' OR '1'='1 là *dữ liệu* (một cái tên), truy vấn trả về 0 dòng thay vì lộ dữ liệu.Thuật ngữ (di chuột để xem giải thích)
Đang tải dữ liệu mẫu…
Đang tải trình soạn thảo…
Chạy truy vấn để xem kết quả tại đây.
Viết truy vấn an toàn tìm user có name đúng bằng chuỗi (dùng nháy): tìm 'An Nguyen'.
Đang tải trình soạn thảo…
- Chạy thử truy vấn mẫu
- Hoàn thành bài tập (0/1)