JSON: tại sao các dấu gạch chéo về phía trước được thoát?


369

Lý do cho việc này "thoát" tôi.

JSON thoát khỏi dấu gạch chéo về phía trước, do đó, hàm băm {a: "a/b/c"}được tuần tự hóa {"a":"a\/b\/c"}thay vì {"a":"a/b/c"}.

Tại sao?


4
FWIW Tôi chưa bao giờ thấy các dấu gạch chéo được thoát trong JSON, tôi chỉ nhận thấy nó với thư viện Java tại code.google.com/p/json-simple
Jason S

24
json_encode()Mặc định, PHP thoát khỏi dấu gạch chéo về phía trước, nhưng có JSON_UNESCAPED_SLASHEStùy chọn bắt đầu từ PHP 5.4.0 (tháng 3 năm 2012)
Walter Tross

6
Đây là một mã PHP sẽ không thoát khỏi mọi dấu gạch chéo, chỉ trong '</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx

Mã có bao gồm '</': hoặc nó bắt đầu ở echo? Bởi vì bắt đầu từ echo thất bại cho tôi. Tôi chỉ đơn giản là không nhận được bất cứ điều gì. Có, tôi đã thay thế $ obj cho biến của mình :)
marciokoko

JSON không thoát hoặc tuần tự hóa bất cứ điều gì ... trình tuần tự JSON của bạn làm. Cái nào bạn đang dùng?
Các cuộc đua nhẹ nhàng trong quỹ đạo

Câu trả lời:


284

JSON không yêu cầu bạn làm điều đó, nó cho phép bạn làm điều đó. Nó cũng cho phép bạn sử dụng "\ u0061" cho "A", nhưng không bắt buộc. Cho phép \/giúp khi nhúng JSON vào <script>thẻ, điều này không cho phép </bên trong các chuỗi, như chỉ ra của Seb.

Một số API ASP.NET Ajax / JSON của Microsoft sử dụng kẽ hở này để thêm thông tin bổ sung, ví dụ: một datetime sẽ được gửi dưới dạng "\/Date(milliseconds)\/". (Kinh quá)


4
Đó sẽ là một điều tốt, thoát khỏi </. Mặc dù JSON không thường được nhúng trong các thẻ script.
Ruben

8
Xem bài đăng trên blog này để biết lý do cho định dạng ngày ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout

25
JSON cần phải được thay thế bởi vì một triển khai cụ thể của trình tuần tự hóa JSON tạo ra một số JSON mà ( trong khi JSON hoàn toàn hợp lệ ) có một số ký tự bổ sung để nó cũng có thể được thả vào một phần tử tập lệnh HTML dưới dạng chữ JS?! Đó không phải là quá nhiều ném em bé ra ngoài với nước tắm như ném em bé ra ngoài vì ai đó đã mua cho anh ta một bộ cánh nước.
Quentin

15
Những gì tôi không nhận được, là tại sao trình tuần tự JSON thậm chí sẽ quan tâm đến nơi JSON kết thúc. Trên một trang web, trong một yêu cầu HTTP, bất cứ điều gì. Hãy để trình kết xuất cuối cùng thực hiện mã hóa bổ sung, nếu nó cần.
Dan Ross

5
@DanRoss Và nó có thể. Việc thoát /là không bắt buộc , nó được cho phép , để dễ dàng sử dụng JSON. Nếu bạn không muốn trốn thoát /thì đừng.
Andreas

35

Thông số JSON nói rằng bạn CÓ THỂ thoát khỏi dấu gạch chéo về phía trước, nhưng bạn không phải làm vậy.


9
Bạn có thể thêm một liên kết đến phần cụ thể đó?
Ryan Gates

1
Thông số kỹ thuật không nói lên điều đó. Trong thực tế tất cả những gì nó nói là bạn phải thoát khỏi nhân vật solidus. Xem ecma
Joa Ebert

10
@JoaEbert: Một con rắn ngược phải được thoát ra, nhưng bạn không cần phải thoát khỏi một con rắn. Phần 9 nói "Tất cả các ký tự có thể được đặt trong dấu ngoặc kép trừ các ký tự phải được thoát: dấu ngoặc kép (U + 0022), solidus ngược (U + 005C) và các ký tự điều khiển U + 0000 đến U + 001F. "
Harold L

4
Cảm ơn Harold! Bạn đúng, cũng được hiển thị trong Hình 5, vì "bất kỳ điểm mã nào ngoại trừ ..." đều nêu rõ rằng / là tùy chọn.
Joa Ebert

15

Tôi đã hỏi cùng một câu hỏi một thời gian trước đây và phải tự trả lời nó. Đây là những gì tôi nghĩ ra:

Dường như, suy nghĩ đầu tiên của tôi [ rằng nó xuất phát từ nguồn gốc JavaScript ] là chính xác.

'\/' === '/'trong JavaScript và JSON JavaScript hợp lệ. Tuy nhiên, tại sao các lối thoát bị bỏ qua khác (như \z) không được phép trong JSON?

Chìa khóa cho việc này là đọc http://www.cs.tut.fi/~jkorpela/www/revsol.html , tiếp theo là http://www.w3.org/TR/html4/appcill/notes.html#hB .3.2 . Tính năng thoát dấu gạch chéo cho phép JSON được nhúng trong HTML (dưới dạng SGML) và XML.


5
Một cơ chế phân phối tải trọng dữ liệu có cấu trúc không nên được gắn với các cấu trúc ngôn ngữ..như điều này có thể thay đổi trong tương lai ... nhưng điều này có thể giải thích các quyết định thiết kế nếu có bất kỳ người tạo JSON nào.

'\ /' === '/' Vì vậy, tôi không cần phải hủy bỏ các dấu gạch chéo về phía trước khi nhận được jsonp của mình?
Timmetje

8

PHP thoát các dấu gạch chéo về phía trước theo mặc định , đó có thể là lý do tại sao điều này xuất hiện rất phổ biến. Tôi không chắc tại sao, nhưng có lẽ vì việc nhúng chuỗi "</script>"bên trong <script>thẻ được coi là không an toàn.

Chức năng này có thể bị vô hiệu hóa bằng cách chuyển qua JSON_UNESCAPED_SLASHEScờ nhưng hầu hết các nhà phát triển sẽ không sử dụng điều này vì kết quả ban đầu đã là JSON hợp lệ.


5

PHP xấu xí!

Các JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESphải mặc định, không phải là một (lạ) tùy chọn ... Làm thế nào để nói nó để php-nhà phát triển?

Các mặc định phải được sử dụng thường xuyên nhất, và (hiện tại) được sử dụng rộng rãi nhất các tiêu chuẩn như UTF8. Có bao nhiêu đoạn mã PHP trong Github hoặc nơi khác cần tính năng "nhúng trong HTML" ngoại lệ này?


2
Đúng nói! Tuy nhiên, PHP khuyến khích tất cả các lỗi kỳ lạ của nó trong tương lai, để không phá vỡ bất kỳ lỗi phổ biến nào trước đây trong tất cả các đoạn PHP lịch sử bị hỏng đó lan rộng khắp thế giới như một loài vật gây hại. Do đó, tất cả những quyết định sai lầm của PHP, có nghĩa là gần như tất cả các quyết định về PHP từ trước đến nay, trở thành tiêu chuẩn. Bạn không thể mong đợi các tiêu chuẩn thay đổi, do đó mỗi nhà phát triển PHP phải biết và thực hiện tất cả các cách giải quyết vô hạn đó trước tất cả các lỗi nghiêm trọng được tìm thấy trong PHP. Nhập stackoverflow ..
Tino

Bạn sai hoàn toàn. Đó là do JavaScript. Như được chỉ ra dưới đây. Trong JS '\/' === '/'trả về đúng. Tôi sẽ khuyên bạn nên bám vào sự thật. Hầu hết mọi người có thể đối phó với một vài tên hàm không nhất quán. Chỉ vì bạn không thể nhìn thấy quá khứ mà không biến PHP thành một công cụ tồi.
Cobolt

1
Xin chào @Cobolt, Đây là một câu hỏi cũ, tôi không sử dụng PHP ngày hôm nay ... Nhưng, như blog thảo luận, cốt lõi là "Mặc định PHẢI là sử dụng thường xuyên nhất" , vì vậy, xấu xí là về việc bỏ qua "sử dụng thường xuyên nhất" này hành vi (cũng xấu xí) của Javascript.
Peter Krauss

1
Đây không phải là nơi để nói về bất kỳ ngôn ngữ cụ thể. Chỉ ra những gì PHP hiện đang làm và cách vô hiệu hóa nó, sẽ hữu ích hơn, và một câu trả lời đã được thêm vào đó .
IMSoP
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.