PHP xác thực JSON

Thư viện triển khai các thông số kỹ thuật mới nhất [bản nháp-2020-12, bản nháp-2019-09, bản nháp-07 và bản nháp-06] của tiêu chuẩn Lược đồ JSON và cung cấp tài liệu toàn diện bao gồm cả tiêu chuẩn và API riêng của thư viện

Trong khi PHP 8. 2 vẫn chưa được phát hành, chúng tôi đã có một cái nhìn thoáng qua về các tính năng mới được cung cấp trong phiên bản 8. 3 năm sau

Vào ngày 14 tháng 8, Juan Carlos Morales đã đề xuất Yêu cầu Nhận xét để giới thiệu

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
9…

RFC này giới thiệu một hàm mới gọi là json_validate[] để xác thực xem một chuỗi có chứa json hợp lệ hay không

Hầu hết các triển khai vùng người dùng đều sử dụng json_decode[] mà theo thiết kế sẽ tạo ra một ZVAL[object/array/etc. ] trong khi phân tích cú pháp chuỗi, nên sử dụng bộ nhớ và quá trình xử lý có thể được lưu

Hàm được đề xuất sẽ sử dụng cùng một trình phân tích cú pháp JSON đã tồn tại trong lõi PHP, cũng được sử dụng bởi json_decode[], điều này đảm bảo rằng những gì hợp lệ trong json_validate[] cũng hợp lệ trong json_decode[]

Đề xuất

Sự miêu tả

json_validate[string $json, int $depth = 512, int $flags = 0]: bool

Thông số

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
6

Chuỗi json đang được phân tích

Chức năng này chỉ hoạt động với các chuỗi được mã hóa UTF-8

Ghi chú

PHP triển khai một siêu bộ JSON như được chỉ định trong bản gốc » RFC 7159

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
7

Độ sâu lồng nhau tối đa của cấu trúc được giải mã

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
8

Mặt nạ bit của JSON_INVALID_UTF8_IGNORE. Hành vi của hằng số này được mô tả trên trang hằng số JSON

Giá trị trả về

Trả về true nếu chuỗi được truyền chứa json hợp lệ, ngược lại trả về false

ví dụ

1. Xác thực chuỗi json hợp lệ

var_dump[json_validate['{ "test": { "foo": "bar" } }']];

Kết quả sẽ là

bool[true]

2. Xác thực chuỗi json không hợp lệ

var_dump[json_validate['{ "": "": "" } }']];

Kết quả sẽ là

bool[false]

Lỗi trong quá trình xác thực có thể được tìm nạp bằng cách sử dụng json_last_error[] và/hoặc json_last_error_msg[]

Ghi chú chung từ cuộc thảo luận về RFC

  • Những người dùng khác nhau đã kiểm tra chức năng và thu được kết quả như đã hứa. Ngoài ra phản hồi của họ về nó là tích cực

  • Hầu hết cộng đồng trong danh sách gửi thư đều có ý kiến ​​tích cực về RFC này và mong muốn nó được tích hợp vào PHP

  • Những người đã kiểm tra mã cũng đồng ý rằng triển khai nhỏ, dễ bảo trì và đồng thời mang lại lợi ích lớn cho việc triển khai nhỏ như vậy

  • Cộng đồng đã tham gia rất tích cực vào cuộc thảo luận về RFC và cung cấp tất cả các loại phản hồi hữu ích, đồng thời cũng dành thời gian để tự mình kiểm tra json_validate[]

Mặc dù không giảm xuống chỉ những ví dụ này, trong quá trình thảo luận trong danh sách gửi thư, một số người dùng đã bày tỏ

“Có, JSON được định dạng tốt từ một nguồn đáng tin cậy có xu hướng nhỏ. Nhưng một chức năng xác thực cũng cần xử lý JSON không được định dạng tốt, nếu không, bạn sẽ không cần xác thực nó. ”

“Nếu với một chức năng mới [json_validate[]], việc chống lại cuộc tấn công Từ chối dịch vụ đối với một số phần của API JSON trở nên dễ dàng hơn nhiều, thì đây có thể là một bổ sung tốt chỉ vì lý do bảo mật. ”

“Việc xác thực nhanh chóng/hiệu quả một định dạng giao tiếp phổ biến làm giảm khả năng tấn công của các cuộc tấn công Từ chối dịch vụ. ”

Dựa trên thảo luận về RFC trong danh sách gửi thư

Theo thiết kế, json_decode[] tạo ra một ZVAL [đối tượng/mảng/v.v. ] trong khi phân tích chuỗi, nên sử dụng bộ nhớ và xử lý chuỗi đó, điều đó là không cần thiết nếu điều duy nhất cần khám phá là chuỗi có chứa json hợp lệ hay không

Nhược điểm của việc sử dụng regex

Sử dụng biểu thức chính quy cho tác vụ này buộc phải triển khai khác nhau, dễ bị lỗi, khó bảo trì

Nhược điểm của giải pháp userland

  • Viết một trình phân tích cú pháp JSON không phải là chuyện nhỏ

  • Chúng cần được cập nhật với trình phân tích cú pháp PHP JSON hiện có được sử dụng bởi json_decode[], nếu không, chuỗi json hợp lệ trong giải pháp userland có thể không phải là chuỗi json hợp lệ cho json_decode[] hoặc ngược lại

  • Công việc dư thừa là viết Trình phân tích cú pháp JSON trong vùng người dùng, vì PHP đã có một trình phân tích cú pháp JSON

PHP đã có trình phân tích cú pháp JSON

Như đã đề cập trước đó, PHP đã có một trình phân tích cú pháp JSON được sử dụng bởi json_decode[]. Hàm được đề xuất sẽ sử dụng trình phân tích cú pháp đó, đảm bảo khả năng tương thích 100% giữa json_decode[] và json_validate[]

Nhu cầu từ các dự án lớn và nhà phát triển

Trong phần “Tham khảo”, có một danh sách các dự án php nguồn mở lớn có thể hưởng lợi với chức năng mới này

Ngoài ra, trong phần được đề cập, một liên kết đến một trong những câu hỏi phổ biến nhất về StackOverflow được cung cấp, bằng cách nào đó phản ánh nhu cầu của các nhà phát triển của chúng tôi về việc bao gồm một tính năng như thế này

Vui lòng kiểm tra phần “Tài liệu tham khảo”

Độ phức tạp được thêm vào trong lõi

Hiện tại, có một trình phân tích cú pháp JSON trong lõi, được sử dụng bởi json_decode[] để thực hiện công việc của nó, vì vậy không cần phải viết một trình phân tích cú pháp JSON mới cho RFC này; . trong bộ nhớ cho nó

Một thành viên của danh sách gửi thư bày tỏ rằng

  • Kết hợp một triển khai nhỏ như vậy có thể đạt được với mã vùng người dùng không phải là một ý tưởng hay

Trích dẫn

“Nếu chúng ta tiếp tục xu hướng làm ô nhiễm thư viện tiêu chuẩn vốn đã cồng kềnh bằng một đội quân các chức năng nhỏ không thể tồn tại và được thay thế bằng các đối tác PHP bình thường IMHO, chúng ta sẽ kết thúc với sự thất vọng từ các nhà phát triển vì tôi tin rằng DX đang dần sụp đổ tại đây. ”

  • json_validate[] sẽ chỉ hữu ích cho các trường hợp Edge

Trích dẫn

“`json_decode[]` là một thay thế mà IMO giải quyết được 99% các trường hợp sử dụng. Nếu tôi tuân theo logic của bạn và chấp nhận mọi bổ sung nhỏ xử lý 1% trường hợp sử dụng, ai đó sẽ tăng RFC khác cho simplexml_validate_string hoặc yaml_validate và PhpToken tiếp theo. xác thực. Tất cả những điều trên có thể hợp lệ nếu chúng tôi tin tưởng rằng mọi người thường xác thực tải trọng 300 MB để không làm gì nếu họ KHÔNG thất bại và không có gì lạ về điều đó. ”

Những thay đổi trong RFC đã xảy ra trong quá trình thảo luận

Ném ngoại lệ khi có lỗi

Trong quá trình triển khai ban đầu của tôi, nhà phát triển có tùy chọn cung cấp cờ để chỉ ra rằng trong trường hợp có lỗi trong quá trình xác thực, một ngoại lệ sẽ được đưa ra

Khả năng đưa ra một ngoại lệ do lỗi đã bị loại bỏ khỏi quá trình triển khai, vì điều này không chỉ được hầu hết người dùng trong danh sách gửi thư chỉ ra [với lý do chính đáng], mà còn trong quá trình xem xét mã;

Tôi cũng phải thừa nhận rằng sau khi họ đưa ra lý lẽ của mình, tôi đã thay đổi suy nghĩ của mình và bây giờ tôi cũng nghĩ rằng có một hành vi như vậy trong chức năng

Vì vậy, việc loại bỏ khả năng ném ngoại lệ do lỗi đã bị xóa khỏi quá trình triển khai

Người khác

  • Tôi đã xóa 3 trong số các ví dụ được cung cấp ban đầu trong RFC vì không phù hợp với mục đích của RFC hoặc không rõ ràng

  • Tôi đã phải điều chỉnh từ ngữ trong tài liệu RFC này về nhược điểm của việc sử dụng json_decode[] như được chỉ ra tại đây

Thay đổi không tương thích ngược

Không có, vì đây chỉ là chức năng mới

json_validate sẽ không còn khả dụng dưới dạng tên hàm

[Các] Phiên bản PHP được đề xuất

Tác động RFC

RFC này không ảnh hưởng đến SAPI, các tiện ích mở rộng hiện có, Opcache, v.v.

Phạm vi tương lai

- [Sẽ được xác định bởi các cuộc thảo luận trong tương lai nếu cần]

Lựa chọn bỏ phiếu được đề xuất

Thực hiện

Người giới thiệu

Các dự án nguồn mở lớn sẽ được hưởng lợi từ điều này

Khung Symfony

________số 8

Khung Laravel

    public function validateJson[$attribute, $value]
    {
        if [is_array[$value]] {
            return false;
        }
 
        if [! is_scalar[$value] && ! is_null[$value] && ! method_exists[$value, '__toString']] {
            return false;
        }
 
        json_decode[$value];
 
        return json_last_error[] === JSON_ERROR_NONE;
    }

Khung Laravel

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
0

Magento

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
1

Magento

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
2

getgrav

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
0

Tôn trọng / Xác nhận

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
1

Tôn trọng / Xác nhận

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
1

cửa hàng chuẩn bị

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
3

WordpressCLI

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
4

CMS JOOMLA

var_dump[json_validate['{ "test": { "foo": "bar" } }']];
5

Trong PHP, câu hỏi này là một trong những câu hỏi được xếp hạng cao nhất liên quan đến json && php trong stackoverflow, “Cách nhanh nhất để kiểm tra xem một chuỗi có phải là JSON trong PHP không?”. Câu hỏi

Đã xem 484 nghìn lần. Bảng xếp hạng

Người hỏi cách thực hiện chính xác điều này, đồng thời cung cấp trường hợp sử dụng thực tế; . Trong Python

Làm cách nào để kiểm tra xem dữ liệu có phải là JSON PHP không?

chúng ta có thể sử dụng hàm PHP json_last_error[] để kiểm tra tính hợp lệ của JSON, Hàm này trả về giá trị hằng định sẵn JSON_ERROR_NONE nếu JSON được giải mã thành công .

JSON có thể được xác thực không?

Lược đồ JSON là một công cụ mạnh mẽ. Nó cho phép bạn xác thực cấu trúc JSON của mình và đảm bảo cấu trúc đó đáp ứng API bắt buộc . Bạn có thể tạo một lược đồ phức tạp và lồng nhau như bạn cần, tất cả những gì bạn cần là các yêu cầu. Bạn có thể thêm nó vào mã của mình dưới dạng thử nghiệm bổ sung hoặc trong thời gian chạy.

Làm cách nào để kiểm tra xem một đối tượng JSON có khóa trong PHP không?

Làm cách nào để tìm khóa của một đối tượng? .
Vật. keys[obj] – trả về tất cả các khóa của đối tượng dưới dạng mảng
Vật. giá trị [obj] – trả về tất cả các giá trị của đối tượng dưới dạng mảng
Vật. entry[obj] – trả về một mảng [key, value]

PHP có chấp nhận JSON không?

PHP có một số hàm tích hợp để xử lý JSON .

Chủ Đề