มันป้องกันการเปิดเผยการตอบสนองผ่าน JSON hijacking
ตามทฤษฎีแล้วเนื้อหาของการตอบกลับ HTTP ได้รับการคุ้มครองโดยนโยบายแหล่งกำเนิดเดียวกัน: หน้าจากโดเมนหนึ่งไม่สามารถรับข้อมูลส่วนใด ๆ จากหน้าในโดเมนอื่น (เว้นแต่จะได้รับอนุญาตอย่างชัดเจน)
ผู้โจมตีสามารถร้องขอหน้าเว็บในโดเมนอื่น ๆ ในนามของคุณเช่นโดยใช้<script src=...>
หรือ<img>
แท็ก แต่ไม่สามารถรับข้อมูลใด ๆ เกี่ยวกับผลลัพธ์ (ส่วนหัวเนื้อหา)
ดังนั้นหากคุณไปที่หน้าของผู้โจมตีมันจะไม่สามารถอ่านอีเมลของคุณจาก gmail.com
ยกเว้นว่าเมื่อใช้แท็กสคริปต์เพื่อร้องขอเนื้อหา JSON JSON จะถูกเรียกใช้เป็น Javascript ในสภาพแวดล้อมที่มีการควบคุมของผู้โจมตี หากผู้โจมตีสามารถแทนที่ Array หรือ Object Constructor หรือวิธีการอื่นที่ใช้ระหว่างการสร้างวัตถุสิ่งใดก็ตามใน JSON จะผ่านรหัสของผู้โจมตีและได้รับการเปิดเผย
โปรดทราบว่าสิ่งนี้เกิดขึ้นในเวลาที่ JSON ถูกเรียกใช้เป็น Javascript ไม่ใช่ตอนที่วิเคราะห์คำ
มีการตอบโต้หลายวิธี:
ตรวจสอบให้แน่ใจว่า JSON ไม่ดำเนินการ
โดยการวางwhile(1);
คำสั่งก่อนข้อมูล JSON Google ทำให้แน่ใจว่าข้อมูล JSON ไม่เคยถูกเรียกใช้เป็น Javascript
เฉพาะหน้าเว็บที่ถูกต้องเท่านั้นที่จะได้รับเนื้อหาทั้งหมดถอดwhile(1);
และแยกส่วนที่เหลือเป็น JSON
เช่นสิ่งที่for(;;);
เคยเห็นที่ Facebook เช่นกับผลลัพธ์เดียวกัน
ตรวจสอบให้แน่ใจว่า JSON ไม่ใช่ Javascript ที่ถูกต้อง
ในทำนองเดียวกันการเพิ่มโทเค็นที่ไม่ถูกต้องก่อน JSON &&&START&&&
จะต้องแน่ใจว่าไม่มีการดำเนินการใด ๆ
ส่งคืน JSON ด้วยวัตถุที่ด้านนอกเสมอ
วิธีนี้เป็นOWASP
วิธีที่แนะนำในการป้องกันจากการจี้ JSON และเป็นการรบกวนน้อยกว่า
เช่นเดียวกับมาตรการตอบโต้ก่อนหน้านี้ตรวจสอบให้แน่ใจว่า JSON ไม่เคยดำเนินการเป็น Javascript
วัตถุ JSON ที่ถูกต้องเมื่อไม่ได้ใส่อะไรก็ไม่ถูกต้องใน Javascript:
eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :
อย่างไรก็ตามนี่เป็น JSON ที่ถูกต้อง:
JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}
ดังนั้นตรวจสอบให้แน่ใจว่าคุณส่งคืนออบเจ็กต์ที่ระดับบนสุดของการตอบกลับเสมอเพื่อให้แน่ใจว่า JSON นั้นไม่ใช่ Javascript ที่ถูกต้องในขณะที่ยังคงเป็น JSON ที่ถูกต้อง
ตามที่บันทึกไว้โดย @hvd ในความคิดเห็นวัตถุที่ว่างเปล่า{}
คือ Javascript ที่ถูกต้องและการรู้ว่าวัตถุนั้นว่างเปล่าอาจเป็นข้อมูลที่มีค่า
การเปรียบเทียบวิธีการข้างต้น
วิธี OWASP นั้นรบกวนน้อยกว่าเนื่องจากไม่ต้องการการเปลี่ยนแปลงไลบรารีไคลเอ็นต์และถ่ายโอน JSON ที่ถูกต้อง ไม่แน่ใจว่าข้อบกพร่องของเบราว์เซอร์ในอดีตหรือในอนาคตสามารถเอาชนะสิ่งนี้ได้หรือไม่ ดังที่บันทึกไว้โดย @oriadam มันไม่ชัดเจนว่าข้อมูลสามารถรั่วไหลในข้อผิดพลาดในการแยกวิเคราะห์ผ่านการจัดการข้อผิดพลาดหรือไม่ (เช่น window.onerror)
วิธีการของ Google ต้องการไลบรารี่ของไคลเอ็นต์เพื่อสนับสนุนการยกเลิกการทำให้เป็นอนุกรมโดยอัตโนมัติและถือว่าปลอดภัยยิ่งขึ้นเกี่ยวกับข้อบกพร่องของเบราว์เซอร์
ทั้งสองวิธีต้องการการเปลี่ยนแปลงฝั่งเซิร์ฟเวอร์เพื่อหลีกเลี่ยงนักพัฒนาจากการส่ง JSON ที่มีช่องโหว่