JSON: ทำไมเครื่องหมายทับซ้ายจึงหนี


369

เหตุผลที่ "หนี" ฉัน

JSONหนีทับดังนั้นกัญชา{a: "a/b/c"}เนื่องเป็นแทน{"a":"a\/b\/c"}{"a":"a/b/c"}

ทำไม?


4
FWIW ผมไม่เคยเห็นทับหนี JSON ผมเพิ่งสังเกตเห็นมันด้วย Java ห้องสมุดที่code.google.com/p/json-simple
เจสัน S

24
PHP ใช้json_encode()เครื่องหมายทับไปข้างหน้าโดยค่าเริ่มต้น แต่มีJSON_UNESCAPED_SLASHESตัวเลือกเริ่มต้นจาก PHP 5.4.0 (มีนาคม 2012)
Walter Tross

6
นี่คือโค้ด PHP ที่จะไม่หลบหนีทุก ๆ สแลชเฉพาะใน'</':echo str_replace('</', '<\/', json_encode($obj, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
rustyx

รหัสรวม '</': หรือมันเริ่มต้นที่ echo หรือไม่? เพราะเริ่มต้นที่เสียงสะท้อนล้มเหลวสำหรับฉัน ฉันไม่ได้อะไรเลย ใช่ฉันแทนที่ $ obj ของฉันสำหรับตัวแปรของฉัน :)
marciokoko

JSON ไม่หลบหนีหรือทำให้เป็นอนุกรมอะไร ... JSON serializer ของคุณทำ คุณใช้อันไหน
การแข่งขัน Lightness ใน Orbit

คำตอบ:


284

JSON ไม่ต้องการให้คุณทำมันช่วยให้คุณทำเช่นนั้นได้ นอกจากนี้ยังช่วยให้คุณใช้ "\ u0061" สำหรับ "A" แต่ไม่จำเป็น ช่วยให้\/ช่วยให้เมื่อฝัง JSON ใน<script>แท็กซึ่งไม่อนุญาตให้</สายภายในเช่นชี้ Seb ออก

บางส่วนของไมโครซอฟท์ ASP.NET อาแจ็กซ์ / JSON API "\/Date(milliseconds)\/"ของใช้ช่องโหว่นี้เพื่อเพิ่มข้อมูลเพิ่มเติมเช่นเป็นวันที่และเวลาจะถูกส่งเป็น (Yuck)


4
นั่นจะเป็นสิ่งที่ดีโดยการหลบหนีเพียง </ แม้ว่า JSON จะไม่ได้ฝังอยู่ในแท็กสคริปต์อยู่แล้ว
Ruben

8
ดูโพสต์บล็อกนี้สำหรับเหตุผลสำหรับรูปแบบวันที่ของ ASP.NET JSON: weblogs.asp.net/bleroy/archive/2008/01/18/dates-and-json.aspx
Michiel van Oosterhout

25
JSON ต้องถูกแทนที่เนื่องจากการใช้งานเฉพาะของ JSON serializer ส่งออก JSON บางอย่างที่ ( ในขณะที่เป็น JSON ที่ถูกต้องทั้งหมด ) มีอักขระพิเศษบางอย่างเพื่อให้สามารถวางลงในองค์ประกอบสคริปต์ HTML เป็นตัวอักษร JS! นั่นไม่ใช่การขว้างทารกออกมาพร้อมกับอาบน้ำเพราะการขว้างลูกออกไปเพราะมีคนซื้อปีกน้ำให้เขา
Quentin

15
สิ่งที่ฉันไม่ได้รับคือเหตุผลที่ JSON serializer จะสนใจว่า JSON นั้นจบลงที่ใด บนหน้าเว็บในคำขอ HTTP ไม่ว่าจะเป็นอะไรก็ตาม ปล่อยให้โหมดแสดงภาพสุดท้ายทำการเข้ารหัสเพิ่มเติมหากต้องการ
Dan Ross

5
@DanRoss และมันสามารถ หนี/ไม่ได้จำเป็นต้องใช้ก็จะได้รับอนุญาตเพื่อบรรเทาการใช้ JSON หากคุณไม่ต้องการที่จะหลบหนี/แล้วทำไม่ได้
Andreas

35

ข้อมูลจำเพาะของ JSON บอกว่าคุณสามารถหลีกเลี่ยงการสแลชได้ แต่คุณไม่จำเป็นต้องทำ


9
คุณสามารถเพิ่มลิงค์ไปยังส่วนเฉพาะได้หรือไม่?
Ryan Gates

1
สเป็คไม่ได้พูดอย่างนั้น ในความเป็นจริงทั้งหมดที่กล่าวคือคุณต้องหลบหนีตัวละครโซลิดัส ดูecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf
Joa Ebert

10
@JoaEbert: ต้องย้อนกลับโซลิดัส แต่คุณไม่จำเป็นต้องหลบหนีโซลิดัส ส่วนที่ 9 กล่าวว่า "อักขระทั้งหมดอาจอยู่ในเครื่องหมายคำพูดยกเว้นอักขระที่ต้องหลีกเลี่ยง: เครื่องหมายคำพูด (U + 0022), โซลิดย้อนกลับ (U + 005C) และอักขระควบคุม U + 0000 ถึง U + 001F "
Harold L

4
ขอบคุณแฮโรลด์! คุณพูดถูกในรูปที่ 5 ว่า "จุดรหัสใด ๆ ยกเว้น ... " ระบุอย่างชัดเจนว่า / เป็นทางเลือก
Joa Ebert

15

ฉันถามคำถามเดียวกันเมื่อไม่นานมานี้และต้องตอบด้วยตนเอง นี่คือสิ่งที่ฉันมาด้วย:

ดูเหมือนว่าความคิดแรกของฉัน [ ที่มาจากรากของJavaScript ] นั้นถูกต้อง

'\/' === '/'ใน JavaScript และ JSON เป็น JavaScript ที่ถูกต้อง อย่างไรก็ตามเหตุใดการยกเว้นที่ไม่สนใจ (เช่น\z) จึงไม่อนุญาตใน JSON

กุญแจสำคัญสำหรับสิ่งนี้คืออ่าน http://www.cs.tut.fi/~jkorpela/www/revsol.htmlตามด้วย http://www.w3.org/TR/html4/appendix/notes.html#hB 3.2 คุณลักษณะของ slash escape ทำให้ JSON สามารถฝังใน HTML (as SGML) และ XML


5
กลไกการจัดส่งข้อมูลที่มีโครงสร้างข้อมูลไม่ควรเชื่อมโยงกับโครงสร้างภาษา .. ซึ่งอาจมีการเปลี่ยนแปลงในอนาคต ... แต่สิ่งนี้อาจอธิบายการตัดสินใจออกแบบหากมีผู้สร้าง JSON คนใดคนหนึ่ง

'\ /' === '/' ดังนั้นฉันไม่ต้องการ unescape forward slash เมื่อรับ jsonp ของฉัน
Timmetje

8

PHP หนีการสแลชไปข้างหน้าตามค่าเริ่มต้นซึ่งอาจเป็นเหตุผลว่าทำไมสิ่งนี้จึงปรากฏขึ้นทั่วไป ฉันไม่แน่ใจว่าทำไม แต่อาจเป็นเพราะการฝังสตริง"</script>"ภายใน<script>แท็กนั้นถือว่าไม่ปลอดภัย

ฟังก์ชันนี้สามารถปิดใช้งานได้โดยผ่านการJSON_UNESCAPED_SLASHESตั้งค่าสถานะ แต่นักพัฒนาส่วนใหญ่จะไม่ใช้สิ่งนี้เนื่องจากผลลัพธ์ดั้งเดิมเป็น JSON ที่ถูกต้องแล้ว


5

PHP น่าเกลียด!

JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHESเริ่มต้นจะต้องไม่ใช่การ (แปลก) ตัวเลือก ... วิธีการบอกว่ามันเป็น PHP-พัฒนา?

เริ่มต้นจะต้องมีการใช้งานบ่อยมากที่สุดและ (ปัจจุบัน) มาตรฐานใช้กันอย่างแพร่หลายเป็น UTF8 มี PHP-code จำนวนเท่าไหร่ใน Github หรือที่อื่น ๆ ที่ต้องการคุณสมบัติ "ฝังตัวใน HTML" นอกเขตนี้?


2
ใช่แล้ว! อย่างไรก็ตาม PHP ส่งเสริมข้อผิดพลาดแปลก ๆ ทั้งหมดในอนาคตเพื่อไม่ให้ทำลายข้อผิดพลาดก่อนหน้านี้ที่พบได้ทั่วไปในตัวอย่างโค้ด PHP ที่มีความเสียหายซึ่งแพร่กระจายไปทั่วโลกอย่างศัตรูพืช ดังนั้นการตัดสินใจผิดพลาดทั้งหมดที่เกิดขึ้นกับ PHP ซึ่งหมายความว่าการตัดสินใจเกือบทั้งหมดเกี่ยวกับ PHP นั้นกลายเป็นมาตรฐาน คุณไม่สามารถคาดหวังได้ว่ามาตรฐานจะเปลี่ยนแปลงดังนั้นนักพัฒนา PHP ทุกคนต้องรู้จักและนำวิธีการแก้ปัญหาเหล่านี้มาใช้เพื่อป้องกันข้อผิดพลาดร้ายแรงที่พบใน PHP ป้อน stackoverflow ..
Tino

คุณผิดอย่างสมบูรณ์ มันเกิดจากจาวาสคริปต์ ตามที่ระบุไว้ด้านล่าง ใน JS '\/' === '/'ส่งคืนจริง ฉันจะแนะนำให้คุณยึดติดกับข้อเท็จจริง คนส่วนใหญ่สามารถรับมือกับชื่อฟังก์ชันที่ไม่สอดคล้องกันสองสามข้อ เพียงเพราะคุณไม่สามารถมองเห็นอดีตที่ไม่ได้ทำให้ PHP เป็นเครื่องมือที่ไม่ดี
Cobolt

1
สวัสดี @Cobolt มันเป็นคำถามเก่าฉันไม่ได้ใช้ PHP วันนี้ ... แต่ในฐานะที่เป็นบล็อกการสนทนาหลักคือ"ค่าเริ่มต้นจะต้องใช้บ่อยที่สุด"ดังนั้นความอัปลักษณ์จึงเป็นเรื่องที่น่าสนใจเพราะ "ใช้บ่อยที่สุด" จากพฤติกรรม (และน่าเกลียด) ของ Javascript
Peter Krauss

1
นี่ไม่ใช่สถานที่พูดจาโผงผางเกี่ยวกับภาษาใด ๆ การระบุว่า PHP ทำอะไรในปัจจุบันและวิธีการปิดการใช้งานมันจะมีประโยชน์มากขึ้นและคำตอบก็ถูกเพิ่มเข้าไปด้วย
IMSoP
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.