Giải thích các khái niệm về Injection trong Software Engineering

Trong phát triển phần mềm, các bạn thường hay nghe đến các khái niệm Dependency Injection, SQL Injection, etc nhưng không hiểu nó như thế nào.
Thực ra các cơ chế này thì vốn rất đơn giản, chả có gì đặc biệt.
Bài viết này mình sẽ giải thích về nguyên lý Injection và Ví dụ liên quan trong Software Engineering 

Ai cần đọc bài này :

  • Dành cho dân chuyên đã biết rồi có cách để tiết kiệm time để giải thích hoặc chém cho các bạn không biết gì.
  • Dân không chuyên, không biết gì có thể hiểu và tự tin chém về các nguyên lý Injection trong Software Engineering.
  • Dành cho việc tham khảo giúp các bạn lười giải thích chia sẻ cho nhau.

I. Injection là gì?

Trước hết những bạn cần hiểu Injection là gì ?

Injection dịch trần từ tiếng Anh thì là sự tiêm chích, tiêm nhiễm. Ex: tiêm thuốc phòng, tiêm chích ma túy, etc.

Kết quả của việc tiêm này thì hoàn toàn có thể mang lại hiệu ứng tốt hoặc xấu tùy vào mình tiêm thuốc hay là ma túy hoặc tiêm thuốc độc dành cho việc tử hình những tử tù ở Nước Ta hay 1 số nước trên quốc tế .
Nhìn 1 cách khái quát hơn, quy trình tiêm là cho thuốc hoặc chất kích thích vào hệ tuần hoàn máu của khung hình và tận dụng hệ tuần hoàn máu này để làm đổi khác ( tốt hoặc xấu ) đến khung hình .
Tuy nhiên ví dụ ở trên là tôi đang nói về việc tiêm thuốc dịch trần tiếng anh là Vaccine Injection. Nó chỉ là 1 trường hợp của Injection trong tiếng Anh thôi .
Thật ra Injection trong tiếng Anh thì hoàn toàn có thể tiêm ( injection ) rất nhiều những loại khác ngoài thuốc. Ví dụ như trong Software Engineering thì có những khái niệm như SQL Injection, OS command Injection, Dependency Injection .
Do từ vựng tiếng việt hạn chế nên người ra dịch là tiêm, và chỉ có từ tiêm thuốc là map với injection nên mọi người chỉ nghĩ đến là việc tiêm thuốc. Và hiện chưa có từ nào để map với từ injection này nên làm cho mọi người bị hiểu nhầm là việc tiêm thuốc ( vốn chỉ là 1 trong những trường hợp đơn cử của injection trong tiếng Anh ). Nói chung việc phối giống cho gà hay thụ tinh ở người thì tiếng anh cũng hoàn toàn có thể gọi là 1 quy trình injection do tác động ảnh hưởng vào chính sách sinh sản có sẵn .
Tôi thì không phải là nhà ngôn ngữ học nên cũng không dám định nghĩa thêm từ tiếng việt nào phân phối đúng chuẩn với từ Injection. Cho nên từ những đoạn tiếp theo tôi sẽ dùng từ Injection cho nó phân biệt với từ ” tiêm ” trong tiếng Việt nhé .

Nói 1 cách trừu tượng hóa Injection là sự tác động đến đến cơ chế có sẵn và lợi dụng cơ chế này cho 1 mục đích nào đó.

Như trường hợp tiêm thuốc thì là dùng thuốc ảnh hưởng tác động đến chính sách tuần hoàn máu. Và nhờ chính sách này thuốc được phát tán khắp khung hình .
Ở trong tăng trưởng phầm mềm thì chính sách này cũng y hệt như vậy. Nếu hiểu như trên thì chính sách này thì vốn rất simple, chả có gì đặc biệt quan trọng đúng không nào ?

Đi sâu phân tích sâu thêm 1 chút thì để thực hiện được việc injection đầy đủ thì sẽ cần các đối tượng sau :

  • Đối tượng cần inject.
  • Lỗ hổng của cơ chế.
  • Cơ chế sẵn có.

Tôi xin phép ví dụ trường hợp tiêm thuốc ( 1 trong những trường hợp của injection ) thì sẽ như sau :

  • Đối tượng cần inject: thuốc.
  • Lỗ hổng: lỗ, ven mạch máu để có thể tiêm tác động vào hệ tuần hoàn.
  • Cơ chế sẵn có: hệ tuần hoàn máu.

Ở đây tôi không nói đến hiệu quả của việc injection vì nói chung mục tiêu ở đầu cuối là sẽ tác động ảnh hưởng biến hóa đến vật chủ, hiệu quả tốt hay xấu không bàn ở đây .
Như ví dụ tôi nói ở trên thì quy trình tiêm thuốc mọi người đều không chú ý đến 1 đối tượng người dùng rất quan trọng, đó là ” lỗ hổng ” – nói một cách dễ hiểu ..
Khi triển khai tiêm thì sẽ cần tìm lỗ ven mạch máu tiên phong. Nếu như trên khung hình không có 1 cái ” lỗ ” nào để hoàn toàn có thể chọc kim tiêm vào, thì sẽ không cách nào tác động ảnh hưởng vào hệ tuần hoàn máu để triển khai xong việc tiêm thuốc ( injection ) .
Và trong những khái niệm về Injection trong Software Engineering thì cái ” lỗ ” cũng rất quan trọng, và khi nào mở màn việc injection thì người ta sẽ cần tìm đến cái ” lỗ ” tiên phong như việc khởi đầu quy trình giao phối của những loài động vật hoang dã có vú .
Các phần tiếp theo tôi cũng đề cập đến những ” lỗ ” hổng này và những bạn nhớ quan tâm nhé .

II – SQL Injection

SQL Injection thì trong Software Engineering thường nói đến lỗ hổng bảo mật thông tin của phầm mềm được cho phép người dùng hoàn toàn có thể truy nhập trực tiếp vào cơ sở tài liệu ( database ) của cả mạng lưới hệ thống nhằm mục đích đánh cắp thông tin, phá hoại mạng lưới hệ thống .

Trước hết dành cho ai chưa biết, SQL ở đây là các câu lệnh dùng để truy nhập vào database của 1 hệ thống.

Cũng giống như việc tiêm thuốc, thay vì inject thuốc thì hoàn toàn có thể inject những câu lệnh SQL từ bên ngoài trải qua chính sách truy nhập cơ sở tài liệu của ứng dụng. Các đối tượng người dùng trong việc injection này gồm có :

  • Đối tượng cần inject:  các câu lệnh SQL.
  • Lỗ hổng:  các nguồn input từ người dùng bên ngoài. Ex: nhập user name, password, nhập thông tin trên trang web, phần mềm.
  • Cơ chế sẵn có:  cơ chế truy nhập đến cơ sở dữ liệu của hệ thống.

Ví dụ như khi tôi viết blog trên website này. Tôi thay vì viết nội dung blog mà thay vào đó, thêm những câu lệnh SQL đổi khác database của hệ thông web để sửa 1 topic của tôi thì rank cao nhất, rate cao nhất để ăn tiền công viết ví dụ điển hình .
Cũng giống như việc tiêm thuốc thôi, thay vì tôi tiêm ( inject ) thuốc để chữa bệnh hay làm chết người thì tôi Inject SQL vào hệ thông để chỉnh sửa data của mạng lưới hệ thống hoặc làm chết mạng lưới hệ thống .
Về mặt bảo mật thông tin thông tin khi mà người dùng tự do lấy hoặc thay data của mạng lưới hệ thống trải qua việc inject những câu lệnh SQL như trên là rất nguy khốn .

Ví dụ: ăn cắp thông tin, sửa dổi tài khoản trên hệ thống tài chính, ngân hàng. Ăn cắp bảng lương của công ty thông qua trang web quản lý của công ty.

Như tôi đã nói ở trên lỗ hổng rất quan trọng để triển khai việc injection, ở đây lỗ hổng là từ input của người dùng, khi mà người dùng tự do inject những câu lệnh SQL để đổi khác cả mạng lưới hệ thống .
Cho nên về mặt bảo mật thông tin thông tin thì việc kiểm tra, validate những nguồn input này của người dùng để ngăn ngừa truy nhập trực tiếp vào là rất quan trọng. Tương tự còn có khái niệm khác về bảo mật thông tin như OS Command Injection, trường hợp này thì là inject những câu lệnh gọi đến hệ quản lý và điều hành của mạng lưới hệ thống nhằm mục đích cướp quyền trấn áp hoặc phá hoại. Về nguyên tắc nó vốn đơn thuần như việc tiêm đã lý giải ở phần I.

III – Dependency Injection

Để hiểu được về cơ chế Dependency Injection trước hết bạn cần phải hiểu trước về nguyên lý Dependency inversion. Tuy nhiên về Dependency inversion thì lại là khái niệm hơi loằng ngoằng 1 chút, cơ mà nó vấn đơn giản.

Để lý giải tôi khởi đầu với ví dụ sau :
Bạn là ông chủ của công ty, hàng ngày cứ đến chiều về phải xem lại thông tin tổng kết lệch giá của công ty. Và để làm được thư ký của bạn sẽ phải bắn mail tổng kết hàng ngày. Tuy nhiên ngày nào bạn cũng phải mất công giục bạn thư ký phải viết báo cáo giải trình đúng giờ, rồi lúc thì cần thông tin này lúc thì cần thông tin kia. Nói chung là việc làm của bạn rất phụ thuộc vào vào bạn thư ký .
Thời gian sau đó bạn rút kinh nghiệm tay nghề thâm thúy, soạn template, ra lao lý về thời hạn báo cáo giải trình bắt thư ký phải làm theo. Và sau đó cứ đến chiều là bạn xem thông tin tổng kết lệch giá của công ty mà không cần phải giục hay nhờ vào nhiều vào thư ký nữa .
Như vậy có phải là sự nhờ vào vào bạn thư ký đã bị đảo ngược đúng không ? bạn thư ký sẽ phải tuân theo những điều kiện kèm theo mà bạn qui định thay vì bạn phải chạy theo và giục thư ký viết báo cáo giải trình .

Quá trình đảo ngược sự phụ thuộc này trong phần mềm gọi là nguyên lý dependency inversion. Module gọi sẽ đưa ra các phương thức, qui định để dependency module phải tuân theo khi thực hiện 1 chức năng nào đó của phần mềm.

Như trong ví dụ trên thì sau khi ra những qui định trên thì bạn hoàn toàn có thể sửa chữa thay thế bất ký cô thư ký nào miễn là thỏa mãn nhu cầu điều kiện kèm theo báo cáo giải trình đúng theo template và đúng giờ. Nói theo cách khác bạn hoàn toàn có thể inject bất kể cô thư ký nào vào chính sách xem lại thông tin tổng kết lệch giá của công ty .

Khái quát thêm chút thì một cô thư ký bất kể gọi là 1 sự phụ thuộc vào ( dependency ) trong chính sách xem lại thông tin tổng kết lệch giá của công ty .
Cơ chế mà inject Dependency trên gọi là Dependency Injection .
Các đối tượng người tiêu dùng trong việc injection này gồm có :

  • Đối tượng cần inject: thư ký.
  • Lỗ hổng: các quy định về template, ngày giờ báo cáo dành cho 1 thư ký bất kỳ.
  • Cơ chế sẵn có: việc xem lại thông tin tổng kết doanh thu của công ty.

Thế còn về Software enginering thì sao ? Thật ra chính sách nó vãn như trên. Trong 1 ứng dụng thì thường được phong cách thiết kế chia thành nhiều những thành phần nhỏ gọi là những module / class. Các module / class thường sẽ gọi nhau để thực thi 1 công dụng của ứng dụng .
Ví dụ : như khi người dùng login vào website này ví dụ điển hình thì thường sẽ có tối thiểu 2 module sau gọi nhau gồm có :

  • Module chính (làm nhiệm vụ login, xác thực username/password).
  • Module truy nhập vào cơ sở dữ liệu.

Module chính sẽ gọi đến module truy nhập vào cơ sở dữ liệu để lấy username/password rồi kiểm tra có hơp lệ để login hay không. Module được gọi đến cụ thể là module truy nhập vào cơ sở dữ liệu thì gọi là 1 dependency module hay còn dịch là module phụ thuộc của module chính. Dependency Injection là cơ chế inject bất kỳ dependency module khác vào cơ chế gọi đến nó.

Để làm được điều đó như các đã giải thích về cơ chế injection trong phần I thì để thực hiên được sẽ cần có 1 cái “lỗ” hổng, để tạo ra lỗ hổng này sẽ cần dựa trên nguyên lý dependency inversion (sự đảo ngược phụ thuộc) trong software design.

Cụ thể lỗ hổng được tạo ra ở đây là những phương pháp, qui định mà dependency module bắt buộc phải phân phối cho chính sách gọi đến nó. Trong software design thì gọi là interface qui định những phương pháp giữa 2 module .
Ví dụ như trong chính sách login, dependency module sẽ cần cung ứng những inteface gồm có phương pháp để kiểm tra username, password trong database .
Các đối tượng người tiêu dùng trong việc injection của chính sách login gồm có :

  • Đối tượng cần inject : dependency module mà truy nhập vào cơ sở dữ liệu.
  • Lỗ hổng : inteface qui định các phương thức mà dependency module phải follow và cung cấp (dựa trên cơ chế Dependency Inversion đã nói ở trên)
  • Cơ chế sẵn có : cơ chế login vào hệ thống.

Kết luận

Cơ chế Dependency Injection này rất có ý nghĩa trong việc tăng trưởng ứng dụng khai mà những đội trong dự án Bất Động Sản tăng trưởng song song những module, unit test hoặc việc bảo dưỡng đổi khác, lan rộng ra source code của module này nhưng không bị tác động ảnh hưởng đến module khác .
Như tôi đã ví dụ cho trường hợp sếp và thư ký ở trên thì những bạn hoàn toàn có thể thấy cơ Dependency Injection này rất có ý nghĩa ngay cả trong đời sống phải không ?

Khái niệm Dependency Injection này vẫn đơn giản như việc tiêm thuốc đúng không?

Xem thêm: Neocortex là gì

Nếu hiểu rồi thì nhớ like và share nhé để tôi còn có động lực viết những blog khác 🙂
Nếu ai không hiểu góp ý để tôi update thêm nhé .

Rate this post
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments