NỘI DUNG
Tiếp theo nội dung Giải ngố API – Phần 1: Web Application Basics kiểu “tàu nhanh” (hiệp 1), kỳ này tôi sẽ múc nốt vấn đề còn lại liên quan đến Web Application Basics, cụ thể là Encoding Schemes (tôi tạm dịch là “cơ chế chuyển đổi dữ liệu”).
#1. Kính thưa các thể loại Encoding Schemes
Encoding scheme là cơ chế để bảo đảm Web Application có thể xử lý các ký tự (characters) đặc biệt cũng như binary data một cách an toàn trong quá trình giao lưu phối hợp của Server side và Client side. Tôi sẽ giới thiệu tóm lược các thể loại Encoding scheme phổ biến trong các mục bên dưới.
Lưu ý:
- Bạn có thể đọc lướt qua các phần sau đây để nắm thông tin sơ bộ và quay lại kiểm tra kỹ hơn khi có nhu cầu. Việc đọc kỹ một lèo toàn bộ phần này sẽ tương đối nhàm chán (và khả năng bạn cũng sẽ quên sạch ngay sau đó nếu không có nhu cầu sử dụng cụ thể);
- Tôi sẽ dùng luôn từ gốc encode/encoding chứ không dùng từ dịch tạm để thuận tiện cho việc tra cứu khi cần (và cũng vì một lý do quan trọng khác là tôi làm biếng gõ nhiều chữ).
#1.1 URL encoding
URL encoding chỉ sử dụng đám printable characters thuộc ASCII chacracter set (0x20 – 0x7e). Trong phạm vi này, đám ký tự đặc biệt (tức là mang ý nghĩa đặc biệt trong URL scheme hoặc HTTP protocol) sẽ cần được encode để tránh rắc rối khi truyền tải qua HTTP.
URL encoding sẽ có dạng: {% prefix}{character’s 2 digit ASCII code in hexadecimal}. Và các đối tượng đặc biệt sau đây sẽ cần được URL-encoded khi đút vào HTTP request theo kiểu data:
- %20 : “space” (“+” là một dạng URL-encoded khác của “space”);
- %25 : “%”
- %3F: ?
- %26 : “&”
- %3d : “=”
- %3B: “;”
- %2A : “+”
- %23 : “#”
Lưu ý:
- Khi đút đám ký tự đặc biệt vào request không phải theo kiểu data (ví dụ dùng để thêm request parameter vào query string) thì tôi có thể quất nguyên bản của nó chứ không cần encode gì cả (lúc này nó đang thể hiện đúng ý nghĩa đặc biệt của nó);
- Một đối tượng URL encoded đặc biệt khác cũng cần lưu ý là Null byte sẽ có dạng %00.
- Bạn có thể tham khảo nhanh ASCII table tại ASCII Table – ASCII codes,hex,decimal,binary,html (rapidtables.com);
#1.2 Unicode encoding
Unicode encoding ngoài việc hỗ trợ writing system nói chung thì cũng có thể dùng để thể hiện các ký tự đặc biệt cho Web Application. Hai dạng phổ biến của Unicode encoding là:
- UTF-16 (dùng 16 bit code unit để thể hiện các ký tự): Sử dụng theo dạng {%u prefix}{character’s Unicode code point expressed in hexadecimal} (ví dụ %u2215 cho Division Slash “/”) khi truyền tải qua HTTP. Bạn có thể xem thêm chi tiết trong nội dung Find all Unicode characters from Hieroglyphs to Dingbats – Codepoints;
- UTF-8 (dùng 8 bit code unit để thể hiện các ký tự): Sử dụng theo dạng {% prefix}{each byte expressed in hexadecimal} (ví dụ %e2%89%a0 cho Not Equal To “≠ “) khi truyền tải qua HTTP. Bạn có thể xem thêm chi tiết trong nội dung UTF-8 code page: characters 8000 (U+1F40) to 8999 (U+2327) (charset.org);
Điểm thú vị ở đây là đôi khi các ông thần gác cửa có nhiệm vụ sàng lọc user input data không biết các đám encoded charaters là gì mà dám nhắm mắt cho qua. Sau khi lọt qua cổng, đâu đó bên trong Web Application lại có ông nào đấy hiểu được đám encoded charaters rồi decode ra xử lý thì tung tóe (ví dụ cái Division Slash “/” ở trên có thể dùng cho Directory Traversal).
#1.3 HTML encoding
Tương tự, HTML encoding cũng sẽ được sử dụng để xử lý các ký tự có ý nghĩa đặc biệt trong HTML (ví dụ đám metacharacter) trước khi đẩy hàng vào HTML documents.
Một số HTML entities đặc biệt được quy định trong HTML encoding bao gồm:
- " : “
- &apos : ‘
- & : &
- < : <
- > : >
Ngoài ra, các ký tự cũng có thể được HTML encoded theo kiểu ASCII code tương ứng với decimal form (ví dụ ' cho Single quote – ‘) hoặc hexadecimal form: (ví dụ ' cho Single quote – ‘).
Cũng giống như Unicode encoding, HTML encoding cũng có thể được dùng để thăm dò vulnerabilities của Web Application (ví dụ việc user input được trả về nguyên xi không chỉnh sửa trong response là dấu hiệu cho thấy Web Application có thể có vấn đề với cross-site scripting).
#1.4 Base64 encoding
Base64 encoding được dùng để biểu diễn binary data với các ký tự có thể in được của bảng mã ASCII (ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/). Ngoài ra, con hàng này cũng có thể dùng encode email attachments để truyền tải qua SMTP hoặc encode credentials cho basic HTTP authentication.
Cơ chế xử lý input data của Base64 encoding có thể tóm lược như sau:
- Chia input data ra thành các block of three bytes;
- Chia mỗi block ra thành 4 chunks of 6 bits data;
- Mỗi chunks có 2^6 cách thể hiện tương ứng 64 ký tự có thể in được của bảng mã ASCII nói trên;
- Trường hợp block cuối cùng của input data chia ra ít hơn 3 chunks thì tiến hành padding với 1 hoặc 2 ký tự “=”.
Điểm mấu chốt ở đây là dựa vào các ký tự có thể in được của bảng mã ASCII và khả năng padding với 1 hoặc 2 ký tự “=”, tôi có thể nhanh chóng xác định Base64-encoded string để decode và đọc nội dung mà server gửi về cho client nhằm thu thập thông tin.
#1.5 Hex encoding
Đối tượng cuối cùng tôi đề cập trong phần Encoding Schemes là Hex encoding. Ông này cũng có thể được dùng để truyền tải binary data bằng cách sử dụng các ký tự trong bảng mã ASCII (nhưng sử dụng dạng hexadecimal). Ví dụ, với Hex encoding, cái string abc sẽ trở thành 616263.
Và cũng tương tự như đám Base64 encoding, đám Hex-encoded string rất dễ nhận biết để từ đó tiến hành decode và thu thập thông tin từ server gửi về cho client.
#2. Ủa vậy rồi API ở đâu?
Vâng, suýt tí nữa tôi quên mất đối tượng chính của series này là Application Programming Interfaces – API chứ không phải Web Application.
Xin phép quay trở lại trọng tâm của câu chuyện. API có thể hiểu đại khái là phương thức thông tin liên lạc giữa các application nói chung (hoặc các phần của application) với khả năng hỗ trợ các ông dựng app tận dụng các hệ thống/tính năng đã được xây dựng (có thể là hệ thống/tính năng được xây dựng nội bộ hoặc của bên ngoài) nhằm tiết kiệm thời gian và công sức xử lý.
Ví dụ sau khi tự dựng một cái application vớ vẩn nào đấy, tôi phát hiện ra mình cần xử lý một số tính năng liên quan đến Google Maps. Lúc này, tôi có thể móc mấy cái docs liên quan đến Google Maps API ra đọc để biết cách giao tiếp và sử dụng các chức năng có sẵn của Google Maps thay vì tự dựng lại mọi thứ từ đầu đến đít.
Với trường hợp Web Application, quá trình thông tin liên lạc thông qua API sẽ dựa trên HTTP protocol (API communications cũng thuộc dạng stateless như HTTP).
Phương thức triển khai sử dụng API cụ thể của các Web Application sẽ tùy thuộc vào tình hình thực tế, ví dụ với các microservice-based application phức tạp, kiểu API Gateway như sau sẽ được sử dụng (Lúc này API Gateway sẽ đóng vai trò như reverse proxy đứng chàng hảng giữa các client apps và microservices phía server nhằm điều tiết các request về các services tương ứng).
The API gateway pattern versus the direct client-to-microservice communication | Microsoft Learn
Rồi, đến đây tôi xin tạm dừng phần giới thiệu ban đầu về Web Application cũng như mối liên hệ giữa Web Application và API. Trong các kỳ tiếp theo tôi sẽ bắt đầu đi sâu vào các nội dung chi tiết của API.
1 thought on “Giải ngố API – Phần 1: Web Application Basics kiểu “tàu nhanh” (hiệp 2)”