SQL injection

Bởi Lê Huy

1.SQL injection (SQLi) là gì?

SQl Injection là một lỗ hổng bảo mật web cho phép kẻ tấn công can thiệp vào các truy vấn mà ứng dụng thực hiện đối với cơ sở dữ liệu của nó. Điều này có thể cho phép kẻ tấn công xem dữ liệu mà thông thường chúng không thể truy xuất được. Điều này có thể bao gồm dữ liệu thuộc về người dùng khác hoặc bất kỳ dữ liệu nào khác mà ứng dụng có thể truy cập.

Trong nhiều trường hợp, kẻ tấn công có thể sửa đổi hoặc xóa dữ liệu này, gây ra những thay đổi liên tục đối với nội dung hoặc hành vi của ứng dụng. Trong một số trường hợp, kẻ tấn công có thể nâng cấp cuộc tấn công  SQLi để xâm phạm máy chủ cơ bản hoặc cơ sở hạ tầng phụ trợ khác. Nó cũng có thể cho phép họ thực hiện các cuộc tấn công từ chối dịch vụ.

SQL Injection

2.Tác động của một cuộc tấn công tiêm nhiễm SQL thành công là gì?

Một cuộc tấn công tiêm nhiễm SQL thành công có thể dẫn đến truy cập trái phép vào dữ liệu nhạy cảm, chẳng hạn như:

  • Mật khẩu.
  • Chi tiết thẻ tín dụng.
  • Thông tin cá nhân của người dùng.

Các cuộc tấn công tiêm nhiễm SQL đã được sử dụng trong nhiều vụ vi phạm dữ liệu nghiêm trọng trong nhiều năm qua. Những điều này đã gây ra thiệt hại về danh tiếng và các khoản tiền phạt theo quy định. Trong một số trường hợp, kẻ tấn công có thể có được một cửa hậu liên tục xâm nhập vào hệ thống của tổ chức, dẫn đến sự xâm phạm lâu dài mà có thể không được chú ý trong một thời gian dài.

 

3.Cách phòng ngừa và ngăn chặn SQL Injection

Bạn có thể ngăn hầu hết các trường hợp chèn SQL bằng cách sử dụng các truy vấn được tham số hóa thay vì nối chuỗi trong truy vấn. Các truy vấn được tham số hóa này còn được gọi là “các câu lệnh được chuẩn bị sẵn”.

Đoạn mã sau dễ bị tấn công bởi  SQLi vì đầu vào của người dùng được nối trực tiếp vào truy vấn:

				
					String query = "SELECT * FROM products WHERE category = '"+ input + "'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(query);
				
			

Bạn có thể viết lại mã này theo cách ngăn không cho dữ liệu đầu vào của người dùng can thiệp vào cấu trúc truy vấn:

				
					PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");
statement.setString(1, input);
ResultSet resultSet = statement.executeQuery();
				
			

Bạn có thể sử dụng truy vấn được tham số hóa cho bất kỳ trường hợp nào mà dữ liệu đầu vào không đáng tin cậy xuất hiện dưới dạng dữ liệu trong truy vấn, bao gồm mệnh đề WHEREvà giá trị trong câu lệnh INSERT or UPDATE. Chúng không thể được sử dụng để xử lý dữ liệu đầu vào không đáng tin cậy trong các phần khác của truy vấn, chẳng hạn như tên bảng hoặc cột hoặc mệnh đề ORDER BY. Chức năng ứng dụng đặt dữ liệu không đáng tin cậy vào các phần này của truy vấn cần phải thực hiện một cách tiếp cận khác, chẳng hạn như:

  • Danh sách trắng các giá trị đầu vào được phép.
  • Sử dụng logic khác nhau để cung cấp hành vi cần thiết.

Để truy vấn được tham số hóa có hiệu quả trong việc ngăn chặn việc chèn SQL, chuỗi được sử dụng trong truy vấn phải luôn là hằng số được mã hóa cứng. Nó không bao giờ được chứa bất kỳ dữ liệu biến đổi nào từ bất kỳ nguồn gốc nào. Đừng quyết định theo từng trường hợp xem một mục dữ liệu có đáng tin cậy hay không và tiếp tục sử dụng nối chuỗi trong truy vấn đối với các trường hợp được coi là an toàn. Bạn rất dễ mắc sai lầm về nguồn gốc của dữ liệu hoặc những thay đổi trong mã khác làm hỏng dữ liệu đáng tin cậy.

4.Ví dụ về 1 cuộc tấn công SQL Injection cơ bản:

Related Posts

Để lại một bình luận