SQL Injection và cách phòng tránh?
Theo Wikipedia:Trường hợp đơn giản nhất sẽ là lỗi không kiểm tra dữ liệu đầu vào:
SQL Injection là một kỹ thuật cho phép những kẻ tấn công lợi dụng lỗ hổng của việc kiểm tra dữ liệu đầu vào trong các ứng dụng web và các thông báo lỗi của hệ quản trị cơ sở dữ liệu trả về để inject (tiêm vào) và thi hành các câu lệnh SQL bất hợp pháp. SQL injection có thể cho phép những kẻ tấn công thực hiện các thao tác, delete, insert, update,… trên cơ sở dữ liệu của ứng dụng, thậm chí là server mà ứng dụng đó đang chạy, lỗi này thường xảy ra trên các ứng dụng web có dữ liệu được quản lý bởi các hệ quản trị cơ sở dữ liệu như SQL Server, MySQL, Oracle, DB2, Sysbase...
Lỗi không kiểm tra dữ liệu đầu vào
Ta có form đăng nhập vào Admin Control Panel của website yourdoimain.com:
Tên đăng nhập: Mật Khẩu:
SELECT * FROM users WHERE username='tên đăng nhập' AND password='mật khẩu';
Tên đăng nhập: a' or 1=1; --Mật khẩu: Để trống
SELECT * FROM users WHERE username='a' or 1=1; --AND password='';
Trong trường hợp này cũng có nhiều cách phá, nếu hacker không muốn đăng nhập admin mà nó muốn DROP một table nào đó trong CSDL, muốn xoá một user nào đó hay nó thêm tên nó thành một thằng admin cũng được, các câu lệnh đều là câu lệnh căn bản của SQL, ví dụ muốn xoá table users:
Tên đăng nhập: a';DROP TABLE users; SELECT * FROM users WHERE 1= 1
Cách khắc phục:
Kiểm tra dữ liệu đầu vào bằng các điều kiện như: Xem tên đăng nhập có chứa các ký tự lạ hay không, có chứa dấu space không. Qua đó giúp chúng ta có thể giới hạn những gì người dùng có thể nhập vào.
Lỗi thay đổi giá trị điều kiện truy vấn
Dạng lỗi này khiến cho kẻ tấn công có thể thay đổi giá trị điều kiện trong câu truy vấn, làm sai lệch sự hiển thị của một ứng dụng chứa lỗi này.
Ví dụ ta có một URL, URL này sẽ hiển thị cuốn sách có ID là 1 trong cửa hàng:
http://yourdoimain.com/books.php?id=1
SELECT booktitle FROM books WHERE id = '1';
http://yourdoimain.com/books.php?id=1' AND 1=2; --
SELECT booktitle FROM books WHERE id = '1' AND 1=2;
Khắc phục:
Không để chỗ cho hacker khai thác. Nếu là URL thì nên Rewrite về một dạng khác có tính bảo mật cao hơn. Hoặc kiểm tra dữ liệu đầu vào trước khi thực hiện câu lệnh truy vấn SQL
Trong hai lỗ hổng trên, lỗ hổng được khai thác nhiều nhất có lẽ là Lỗi không kiểm tra dữ liệu đầu vào. Chúng ta nên có một sự chắc chắn về dữ liệu đầu vào trước khi thực hiện truy vấn câu lệnh SQL.