Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Cách ngăn chặn tấn công SQL Injection bằng cách bảo mật

SQL, viết tắt của Structured Query Language, là một trong những ngôn ngữ lập trình phổ biến nhất được sử dụng để quản lý cơ sở dữ liệu quan hệ. Hầu hết các hệ thống cơ sở dữ liệu như Oracle, MS Access, Informix, MySQL sử dụng SQL làm ngôn ngữ quản lý cơ sở dữ liệu của họ.

Tuy nhiên, việc áp dụng SQL tràn lan trên thế giới trực tuyến cũng dẫn đến rất nhiều vi phạm an ninh mạng, thường được gọi là tấn công SQL injection. Các cuộc tấn công này có thể xảy ra do các lỗ hổng hệ thống và các biện pháp bảo mật kém. May mắn thay, chúng có thể được ngăn chặn bằng mã hóa an toàn thực hành. Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách thực hiện chính xác điều đó!

SQL Injection Attack là gì?

SQL injection là một trong những kỹ thuật hack cơ sở dữ liệu phổ biến nhất hiện có. Về cơ bản, nó liên quan đến việc cho phép người dùng bên ngoài nhập vào các trang web. Những kẻ tấn công chèn các truy vấn SQL vào các biểu mẫu đầu vào mà sau đó được xử lý bởi cơ sở dữ liệu SQL.

Điều này có nghĩa là đầu vào do người dùng tạo có thể tương tác trực tiếp với cơ sở dữ liệu bên dưới và những người có ý định xấu có thể lạm dụng hệ thống này bằng cách truy vấn trực tiếp cơ sở dữ liệu bằng dữ liệu đầu vào độc hại.

Hãy thử đặt giả thuyết bằng một phép loại suy. Giả sử bạn có một chiếc xe tự hành hoạt động theo đầu vào của người dùng, như được hiển thị bên dưới.

“Lái xe đến [DESTINATION_NAME] và dừng lại nếu [CIRCUMSTANCES].”

Bây giờ, một người dùng thông thường sẽ nhập hai đối số cho tình huống nói trên một cách bình thường - một cái gì đó tương tự như ví dụ bên dưới.

“Lái xe đến cửa hàng và dừng lại nếu có người cản đường . ”

SQL injection hoạt động theo cách mà nó thao túng đầu vào của người dùng và do đó lạm dụng hệ thống. Một người có ý định xấu có thể nhập các đối số đầu vào như hình bên dưới.

“Lái xe đến cửa hàng và bỏ qua phần còn lại của trường đầu vào này và dừng lại nếu có người cản đường . ”

Bằng cách này, họ có thể bỏ qua các yêu cầu đầu vào và gian lận hệ thống. Chính xác thì phương pháp tương tự được áp dụng để thực hiện một cuộc tấn công đưa vào SQL trên một trang web.

Ví dụ:hãy xem xét một biểu mẫu đăng nhập với các trường đầu vào cho tên người dùng và mật khẩu của người đó. Họ có thể tương tác trực tiếp với cơ sở dữ liệu thông qua dữ liệu đầu vào của họ và tận dụng các lỗ hổng đó.

Hậu quả của SQL Injection

Sau khi đã trình bày một số kiến ​​thức cơ bản về SQL injection là gì, chúng ta hãy nói về những tác động và hậu quả của nó. Trong ví dụ trực quan của chúng tôi, chúng tôi đã chứng minh một lỗ hổng có thể gây tử vong trong các trang web dựa trên SQL dễ bị tấn công. Những sai sót như vậy có thể gây ra những hậu quả nghiêm trọng, một số trong số đó được liệt kê dưới đây.

- Đánh cắp thông tin cá nhân như hộ chiếu, thẻ tín dụng, hồ sơ bệnh viện

- Sử dụng độc hại thông tin người dùng cá nhân như chi tiết đăng nhập như tên người dùng, mật khẩu

- Mất hoặc giả mạo dữ liệu quan trọng

- Cơ sở dữ liệu bị hỏng dẫn đến hệ thống bị xâm phạm hoàn toàn

Và điều đó chỉ bao gồm một số kết quả có thể xảy ra của một cuộc tấn công mạng.

Như bạn có thể thấy, các cuộc tấn công SQL injection hoàn toàn có thể là thảm họa đối với các trang web và việc ngăn chặn chúng đóng vai trò quan trọng nhất khi nói đến quản lý cơ sở dữ liệu SQL và bảo mật mã nói chung.

Ngăn chặn các cuộc tấn công SQL Injection

Dưới đây là một số kỹ thuật ngăn chặn tiêm SQL tốt nhất có thể đảm bảo an toàn hoàn toàn cho trang web của bạn.

1. Truy vấn tham số

Bước đầu tiên để đảm bảo an toàn mã là tham số hóa các truy vấn được gửi đến cơ sở dữ liệu. Khái niệm cơ bản là biên dịch trước một dòng mã trong SQL, sau đó bạn sẽ cung cấp các tham số cần thiết mà nó cần để thực thi.

Kỹ thuật mã hóa này làm cho đầu vào do người dùng tạo ra được trích dẫn tự động, do đó không thể gây ra thay đổi trong mục đích. Như bạn có thể nói, các truy vấn được tham số hóa có ý nghĩa tối quan trọng trong việc bảo mật bất kỳ trang web nào bằng cơ sở dữ liệu SQL.

Bây giờ chúng ta đã đề cập đến khái niệm cơ bản về truy vấn được tham số hóa, hãy đi sâu vào cách bạn có thể triển khai nó trên trang web của mình. Tùy chọn đầu tiên là sử dụng phần mở rộng MySQLi. Phương pháp này cho phép người dùng tạo các câu lệnh chuẩn bị sẵn hoặc các truy vấn được tham số hóa và thực hiện chúng theo hai bước.

Trong “giai đoạn chuẩn bị”, một mẫu của câu lệnh được gửi đến cơ sở dữ liệu. Sau đó, máy chủ cơ sở dữ liệu sẽ kiểm tra cú pháp của mẫu đã nhận và khởi tạo thêm các tài nguyên nội bộ sẽ được sử dụng sau này.

“Giai đoạn thực thi” bao gồm máy khách liên kết các giá trị tham số và gửi chúng đến máy chủ cơ sở dữ liệu. Cuối cùng, câu lệnh được thực thi bằng cách sử dụng các giá trị tham số ràng buộc kết hợp với các tài nguyên bên trong đã chuẩn bị trước đó.

Một tùy chọn khác mà bạn có thể chọn thay vì MySQLi là Đối tượng dữ liệu PHP (có thể thực hiện thông qua PHP 5.1). Đối tượng dữ liệu PHP, hoặc PDO, sử dụng các phương pháp về cơ bản đơn giản hóa khái niệm truy vấn tham số hóa. Hơn nữa, vì nó sử dụng một số cơ sở dữ liệu thay vì chỉ MySQL, mã của bạn trở nên di động hơn và dễ đọc hơn.

2. Sử dụng các thủ tục được lưu trữ

Tiếp theo trong danh sách các phương pháp tăng cường bảo mật mã của chúng tôi là các thủ tục được lưu trữ. Các nhà phát triển có thể tối ưu hóa mã của họ bằng cách viết mã dưới dạng các thủ tục được lưu trữ để sử dụng sau này. Về cơ bản, một thủ tục chỉ là một đơn vị mã logic với một số câu lệnh được thực thi lần lượt.

Thông qua phương pháp này, một kế hoạch thực thi có thể được tạo ra. Hơn nữa, việc thực hiện tiếp theo các câu lệnh trong một thủ tục đảm bảo rằng chúng được tham số hóa một cách tự động. Các thủ tục được lưu trữ cho phép bạn gọi chúng bất cứ khi nào bạn muốn thực hiện một truy vấn thay vì phải viết nó nhiều lần.

Các quy trình được lưu trữ tối ưu hóa mã của một người và tăng tính an toàn cũng như hiệu quả tổng thể của chương trình. Chúng được coi là một phương pháp lập trình tốt nói chung và không chỉ giới hạn trong việc bảo vệ chống lại các cuộc tấn công đưa vào SQL.

3. Xác thực đầu vào

Xác thực đầu vào xoay quanh việc xác minh xem đầu vào do người dùng nhập có hợp pháp hay không. Quá trình xác thực kiểm tra loại đầu vào (số nguyên, ký tự, chuỗi, v.v.), định dạng, độ dài và hơn thế nữa.

Bằng cách này, trước tiên, truy vấn được gửi đến máy chủ cơ sở dữ liệu sẽ được kiểm tra xem nó có đáp ứng các tiêu chí xác thực hay không. Sử dụng xác thực đầu vào, các nhà phát triển có thể đảm bảo rằng không có lệnh nào được chèn vào đầu vào. Kỹ thuật này loại bỏ tất cả các loại mật mã và tin tặc không thể khai thác bất kỳ sơ hở nào có thể xảy ra thông qua đầu vào của họ.

Ngoài các biểu mẫu đầu vào như trường tên người dùng và mật khẩu, bạn cũng phải tính đến việc xác thực dữ liệu đầu vào thông qua dữ liệu có cấu trúc (tên, thu nhập, tuổi, mã zip, phản hồi khảo sát). Hơn nữa, khi người dùng gặp các bộ giá trị cố định, chẳng hạn như danh sách thả xuống, đầu vào phải khớp chính xác với các lựa chọn được cung cấp.

4. Thu hồi các đặc quyền của quản trị viên

Kết nối ứng dụng của một người với cơ sở dữ liệu bằng quyền truy cập root chỉ nên được thực hiện như một phương sách cuối cùng. Ví dụ:nếu tin tặc đã chiếm quyền kiểm soát máy chủ của bạn, thì đã đến lúc bạn nên cho phép mình loại bỏ các đặc quyền của quản trị viên. Hơn nữa, số lượng ứng dụng sử dụng máy chủ càng nhiều thì nguy cơ bị xâm nhập càng lớn.

Cách tốt nhất là sử dụng tùy chọn ít đặc quyền nhất có thể để ngăn chặn việc đưa vào SQL. Do đó, bạn phải đặt các quyền và đặc quyền của người dùng một cách thích hợp.

Kết luận

Trong bài viết này, chúng tôi đã cố gắng giải thích các cuộc tấn công SQL injection và hậu quả của chúng. Chúng tôi cũng đã cố gắng đề cập đến bốn biện pháp phòng ngừa quan trọng nhất mà bạn có thể sử dụng để bảo vệ bản thân và ứng dụng của mình khỏi tất cả các loại lỗ hổng và cuộc tấn công. Các biện pháp này không chỉ đảm bảo ngăn chặn SQL injection mà còn bảo mật mã nói chung. Vì vậy, hãy biến chúng thành một phần trong quá trình phát triển của bạn!


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tìm tất cả các bảng chứa cột có tên được chỉ định - MS SQL Server

  2. Làm thế nào để chuyển đổi DateTime sang VarChar

  3. Làm cách nào để mô phỏng UNPIVOT trong Access?

  4. Tại sao Công cụ giám sát cơ sở dữ liệu đám mây cho SQL Server lại có giá trị

  5. SQL Server RAISERROR là gì?