RFC 9839 Giải Quyết Vấn Đề "Unicode Xấu" Gây Hỏng Phần Mềm và Giao Thức

Nhóm Cộng đồng BigGo
RFC 9839 Giải Quyết Vấn Đề "Unicode Xấu" Gây Hỏng Phần Mềm và Giao Thức

Internet Engineering Task Force ( IETF ) đã công bố RFC 9839 , một tiêu chuẩn mới giải quyết các ký tự Unicode có vấn đề có thể làm hỏng hệ thống phần mềm và giao thức mạng. Mặc dù Unicode được chấp nhận rộng rãi như tiêu chuẩn mã hóa văn bản hàng đầu, nhưng không phải tất cả các ký tự của nó đều phù hợp cho mọi ứng dụng.

RFC này, được viết bởi Tim Bray và Paul Hoffman , xác định các ký tự Unicode cụ thể gây ra vấn đề trong các hệ thống thực tế và đưa ra ba tập con đơn giản hóa mà các nhà phát triển có thể sử dụng thay cho framework PRECIS phức tạp hơn từ năm 2017.

Vấn Đề với Các Ký Tự Unicode Xấu

Vấn đề cốt lõi nằm ở một số ký tự Unicode mà mặc dù về mặt kỹ thuật là hợp lệ, nhưng lại tạo ra những vấn đề nghiêm trọng khi được sử dụng trong các trường văn bản. Chúng bao gồm các byte null can thiệp vào ngôn ngữ lập trình, các surrogate không ghép đôi từ mã hóa UTF-16 không nên tồn tại trong UTF-8 , và các noncharacter mà Unicode cấm rõ ràng cho việc trao đổi dữ liệu.

Một ví dụ đặc biệt gây rắc rối liên quan đến các mã điều khiển cũ như CHARACTER TABULATION WITH JUSTIFICATION - một lệnh định dạng mơ hồ được thừa hưởng từ các tiêu chuẩn những năm 1990 không có tác dụng thực tế trong các ứng dụng hiện đại nhưng có thể gây ra hành vi không thể dự đoán trên các hệ thống khác nhau.

Cuộc thảo luận cộng đồng cho thấy cuộc tranh luận đang diễn ra về việc nên thực thi các hạn chế này ở đâu. Một số nhà phát triển cho rằng các giao thức cấp thấp như JSON nên giữ tính linh hoạt, để việc lọc ký tự cho các lớp xác thực cụ thể của ứng dụng. Những người khác cho rằng việc thất bại an toàn ở cấp độ giao thức sẽ ngăn chặn các vấn đề phía sau.

Các loại ký tự Unicode có vấn đề:

  • Surrogates: Các tạo phẩm mã hóa UTF-16 không được ghép đôi (ví dụ: U+DEAD)
  • Legacy Controls: Các lệnh định dạng lỗi thời từ các tiêu chuẩn thập niên 1990 (ví dụ: U+0089)
  • Noncharacters: Các điểm mã bị cấm rõ ràng để trao đổi (ví dụ: U+7FFFF)
  • Null Bytes: Các ký tự U+0000 gây can thiệp với các ngôn ngữ lập trình

Thách Thức Triển Khai và Mối Quan Ngại Bảo Mật

Các tác động bảo mật vượt ra ngoài các lỗi phân tích đơn giản. Các ký tự ghi đè hướng có thể làm cho tên người dùng xuất hiện đọc từ phải sang trái, có khả năng làm cho giao diện quản trị không thể đọc được. Nghiêm trọng hơn, các ký tự này cho phép các cuộc tấn công Trojan source nơi mã được hiển thị không khớp với các byte thực tế đang được thực thi.

Các định dạng dữ liệu khác nhau xử lý các ký tự có vấn đề một cách không nhất quán. JSON cho phép tất cả các loại có vấn đề, trong khi XML và YAML cung cấp bảo vệ một phần. Sự không nhất quán này tạo ra những rắc rối về khả năng tương tác khi các hệ thống trao đổi dữ liệu giữa các định dạng.

Tôi thà không cho phép bất kỳ emoji mới nhất nào xuất hiện trên đường phố từ tên người dùng hơn là có khả năng cho phép nó làm hỏng mọi trang hiển thị tên người dùng.

RFC đưa ra ba tập con ngày càng hạn chế: Scalars (chỉ loại trừ surrogates), XML (khớp với các hạn chế XML ), và Assignables (loại trừ tất cả các loại có vấn đề). Cách tiếp cận theo từng cấp độ này cho phép các nhà phát triển chọn các hạn chế phù hợp dựa trên nhu cầu cụ thể của họ.

Các Tập Con Được Đề Xuất trong RFC 9839:

Tên Tập Con Loại Trừ Surrogates Loại Trừ Legacy Controls Loại Trừ Noncharacters
Scalars Không Không
XML Một phần Một phần
Assignables

Phản Ứng Cộng Đồng và Việc Áp Dụng Thực Tế

Phản ứng của nhà phát triển có sự pha trộn nhưng nhìn chung là tích cực. Nhiều người đánh giá cao việc có một tài liệu tham khảo tiêu chuẩn hóa cho các hạn chế ký tự thay vì mỗi dự án tạo ra các quy tắc riêng của mình. Tuy nhiên, một số lo lắng về các hạn chế quá rộng có thể chặn các trường hợp sử dụng hợp pháp, chẳng hạn như các ký tự điều khiển trong ứng dụng terminal hoặc nội dung tệp thực sự cần các chuỗi Unicode bất thường.

Thời điểm có vẻ phù hợp để áp dụng. Không giống như framework PRECIS toàn diện nhưng phức tạp, RFC 9839 đưa ra một cách tiếp cận đơn giản hơn không ràng buộc việc triển khai với các phiên bản Unicode cụ thể. Tính linh hoạt này thu hút các nhà phát triển muốn hỗ trợ emoji và ký tự mới nhất mà không cần phối hợp phiên bản rộng rãi giữa các hệ thống.

RFC đại diện cho một sự thỏa hiệp thực dụng giữa tính phổ quát đầy tham vọng của Unicode và nhu cầu thực tế của các hệ thống phần mềm mạnh mẽ. Khi nhiều nhà phát triển triển khai các hướng dẫn này, chúng ta sẽ thấy ít lỗi xử lý văn bản bí ẩn hơn và hành vi có thể dự đoán được hơn trên các nền tảng và ứng dụng khác nhau.

Tham khảo: RFC 9839 and Bad Unicode