Tiếng Việt

Công cụ dành cho nhà phát triển · JSON trình định dạng và xác thực

Khóa trùng lặp trong JSON: những gì RFC 8259 cho phép và những gì trình phân tích cú pháp thực hiện

· Lý lịch

json tiêu chuẩn xác nhận

Khóa trùng lặp trong JSON: những gì RFC 8259 cho phép và những gì trình phân tích cú pháp thực hiện được minh họa bằng mã thông báo JSON và ranh giới xác thực chính xác
Hình minh họa vector ToolAcre gốc

Ngữ pháp của JSON cho phép cùng một khóa hai lần, thông số kỹ thuật chỉ cho biết tên 'phải' là duy nhất và các trình phân tích cú pháp không đồng ý về giá trị nào thắng. Bài đăng này giải thích lý do tại sao điều đó lại quan trọng đối với tính chính xác và bảo mật.

Máy chủ đã đọc 'vai trò' nào?

Hãy xem xét `{"role":"viewer","role":"editor"}`. Cả hai thành viên đều hoàn chỉnh về mặt ngữ pháp, vì vậy ToolAcre báo cáo JSON hợp lệ. Khi văn bản đạt `JSON.parse`, đối tượng kết quả có một thuộc tính `role` có giá trị là `"editor"`. Thành viên trước đó không được giữ lại dưới dạng lịch sử ẩn. Do đó, việc kiểm tra cú pháp thành công sẽ không trả lời gì về việc tên đối tượng có xuất hiện nhiều lần hay không.

Việc định dạng làm cho việc mất dữ liệu chỉ hiển thị sau khi nó đã xảy ra: kết quả đầu ra chứa `{"role":"editor"}` trong bố cục đã chọn. Nó không thể tái tạo thành viên `viewer` bị loại bỏ vì quá trình tuần tự hóa nhận đối tượng được phân tích cú pháp chứ không phải chuỗi thành viên ban đầu. Nếu các tên lặp lại quan trọng đối với việc đánh giá, hãy giữ nguyên và kiểm tra văn bản nguồn trước khi nhấn Định dạng thay vì dựa vào kết quả được chuẩn hóa.

Ngữ pháp cho phép, thông số kỹ thuật không khuyến khích nó

RFC 8259 cho biết tên trong một đối tượng phải là duy nhất. Cái “nên” đó thúc đẩy đầu ra có khả năng tương tác mà không biến tính duy nhất thành một phần của ngữ pháp đối tượng cơ bản. Tên lặp lại vẫn bao gồm một chuỗi, dấu hai chấm và giá trị hợp lệ ở vị trí chính xác được phân tách bằng dấu phẩy. Do đó, trình xác thực ngữ pháp có thể chấp nhận tài liệu trong khi chính sách ứng dụng từ chối nó.

Sự khác biệt này rất dễ bị bỏ sót vì nhiều lỗi là lỗi cú pháp bắt buộc: thiếu dấu hai chấm hoặc dấu phẩy ở cuối không thể tạo thành đối tượng JSON. Bản sao là khác nhau. Họ tạo một câu hỏi về khả năng tương tác sau khi trình phân tích cú pháp nhận ra mọi mã thông báo. ToolAcre cố tình dừng lại ở cú pháp và không thêm quy tắc tên trùng lặp, do đó, kết quả Hợp lệ của nó không được đọc dưới dạng đảm bảo tính duy nhất.

JSON.parse và ToolAcre làm gì

`JSON.parse` sử dụng lần xuất hiện sau khi tên đối tượng lặp lại. ToolAcre kế thừa hành vi đó vì nó phân tích cú pháp trước khi định dạng. Đối với `{"limit":10,"limit":25,"unit":"items"}`, xác thực thành công, giới hạn được phân tích cú pháp là 25 và đầu ra được định dạng chứa một `limit`. Việc sắp xếp khóa tùy chọn có thể định vị lại thuộc tính còn sót lại đó nhưng không thể hiển thị sự xuất hiện bị ghi đè.

Đừng khái quát hóa kết quả đó cho mọi trình phân tích cú pháp hoặc cấu hình. Một số hệ thống có thể từ chối các bản sao và các ngăn xếp xử lý khác có thể áp dụng chính sách khác hoặc kiểm tra mã thông báo trước khi xây dựng một đối tượng. Tuyên bố an toàn trên nhiều hệ thống có phạm vi hẹp: các tên lặp lại không thể tương tác một cách đáng tin cậy. Kiểm tra các chế độ phân tích cú pháp thực tế được sử dụng tại mỗi ranh giới khi sự khác biệt có ý nghĩa quan trọng, thay vì dựa vào yêu cầu trên toàn bộ ngôn ngữ.

Khi sự bất đồng của trình phân tích cú pháp trở thành rủi ro

Các bản sao chỉ trở thành mối lo ngại về bảo mật trong một lộ trình nhiều giai đoạn cụ thể, nơi các thành phần diễn giải cùng một văn bản một cách khác nhau. Ví dụ: bộ lọc yêu cầu có thể kiểm tra một lần xuất hiện trong khi ứng dụng sử dụng một lần xuất hiện khác. Việc điều đó có thể xảy ra hay không phụ thuộc vào trình phân tích cú pháp chính xác, tùy chọn, hành vi chuyển tiếp và việc sử dụng trường. Chỉ riêng cú pháp trùng lặp không chứng minh được một lỗ hổng có thể khai thác được.

Kiểm soát có thể bảo vệ là thiết lập một chính sách ở ranh giới tin cậy và kiểm tra ngăn xếp thực. Từ chối các tên trùng lặp trước khi xây dựng đối tượng bị mất khi sự mơ hồ là không thể chấp nhận được hoặc đảm bảo mọi thành phần đều nhận được cùng một biểu diễn đã được phân tích cú pháp. ToolAcre có thể thể hiện hành vi định dạng cuối cùng của chính nó nhưng không thể kiểm tra các cổng, khung hoặc dịch vụ không phải là một phần của công cụ trình duyệt.

Ví dụ hoạt động: một tài liệu có khóa lặp lại

Dán `{"theme":"light","prefs":{"density":"roomy","density":"compact"},"theme":"dark"}`. ToolAcre chấp nhận văn bản vì mọi thành viên đều hợp lệ về mặt cú pháp. Quá trình phân tích cú pháp để lại chủ đề gốc là `dark` và mật độ lồng nhau là `compact`. Định dạng sẽ tạo ra một bản sao của mỗi tên, do đó cả hai giá trị trước đó đều biến mất khỏi tài liệu được hiển thị.

Ví dụ đó cũng cho thấy tại sao việc tìm kiếm kết quả được định dạng lại quá muộn. Phát hiện trùng lặp phải quan sát tên thành viên trong khi đọc luồng mã thông báo gốc, ở mọi độ sâu đối tượng. Mảng không cần quy tắc trùng tên, mặc dù các quy tắc ứng dụng riêng biệt có thể quan tâm đến các giá trị phần tử lặp lại. Giữ nguyên nguồn, chạy trình phân tích cú pháp nhận biết trùng lặp hoặc nói dối dựa trên nguồn đó và quyết định xem chính sách đó là cảnh báo hay từ chối.

Phát hiện sự trùng lặp có mục đích

Sử dụng công cụ hứa hẹn phát hiện tên trùng lặp một cách rõ ràng trên nguồn JSON. Các phương pháp tiếp cận phù hợp bao gồm chế độ phân tích cú pháp không thành công khi lặp lại, trình xử lý mã thông báo phát trực tuyến theo dõi tên cho từng đối tượng đang mở hoặc trình nói dối có quy tắc khóa trùng lặp được ghi lại. Xác minh các đối tượng lồng nhau và tên thoát: `"name"` và `"name"` giải mã thành cùng một tên thành viên mặc dù cách viết nguồn của chúng khác nhau.

JSON Lược đồ không thể thay thế một khi quá trình phân tích cú pháp thông thường đã loại bỏ các lần xuất hiện trước đó. Trình xác thực lược đồ thường nhận giá trị được xây dựng và xem một thuộc tính chứ không phải lịch sử mã thông báo trùng lặp. Chạy kiểm tra tính duy nhất trước hoặc trong khi phân tích cú pháp, sau đó áp dụng kiểm tra lược đồ cho giá trị rõ ràng. ToolAcre không thực hiện phát hiện trùng lặp hay xác thực lược đồ, do đó cả hai đều yêu cầu một bước riêng biệt, được xây dựng có mục đích.

Điều này không bao gồm những gì

Tên đối tượng lặp lại không giống với các giá trị lặp lại trên các bản ghi. `[ {"id":7}, {"id":7} ]` chứa hai đối tượng riêng biệt, mỗi đối tượng có một `id`; phát hiện một mã định danh trùng lặp có một quy tắc tập dữ liệu. Tương tự, hai phần tử mảng có cùng chuỗi vẫn giữ nguyên hai vị trí có chủ ý trừ khi hợp đồng ứng dụng cho biết mảng đại diện cho một tập hợp.

Bài viết này không yêu cầu chính sách chung về lợi ích đầu tiên, lợi ích cuối cùng hoặc từ chối cho các hệ sinh thái ngôn ngữ rộng. Nó ghi lại hành vi `JSON.parse` có thể quan sát được của ToolAcre và giải thích lý do tại sao phải kiểm tra trực tiếp một thành phần khác. Nó cũng không xác định khả năng khai thác chỉ từ một bản sao. Tác động bảo mật yêu cầu bằng chứng cho thấy các cách hiểu khác nhau vượt qua ranh giới ủy quyền, định tuyến hoặc xác thực có liên quan.

Bài học rút ra: JSON hợp lệ không phải lúc nào cũng rõ ràng JSON

Kết quả ToolAcre hợp lệ có nghĩa là chuỗi mã thông báo nghiêm ngặt JSON; điều đó không có nghĩa là mọi tên đối tượng đều là duy nhất. `JSON.parse` giữ giá trị cuối cùng cho tên lặp lại và định dạng chỉ tuần tự hóa tên sống sót đó. Vì lần xuất hiện trước đó đã bị xóa nên kết quả đầu ra được định dạng là bằng chứng không phù hợp để quyết định liệu nguồn ban đầu có chứa các bản sao hay không.

Khi tính duy nhất quan trọng, hãy kiểm tra văn bản gốc bằng công cụ nhận biết sự trùng lặp trước khi phân tích cú pháp hoặc định dạng thông thường. Áp dụng xác thực lược đồ và tên miền sau đó cho giá trị rõ ràng thu được. Để xem xét bảo mật, hãy theo dõi đường dẫn yêu cầu thực tế và cài đặt trình phân tích cú pháp thay vì giả sử không đồng ý. Quy tắc thực tế rất đơn giản: chấp nhận cú pháp, chính sách tên trùng lặp và ý nghĩa xuôi dòng là các kiểm tra riêng biệt với bằng chứng riêng biệt.