Γιατί η Google προσθέτει το while(1);
στις (ιδιωτικές) απαντήσεις JSON;
Για παράδειγμα, εδώ είναι μια απάντηση ενώ ενεργοποιείτε και απενεργοποιείτε ένα ημερολόγιο στο Google Calendar:
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
['remindOnRespondedEventsOnly','true'],
['hideInvitations_remindOnRespondedEventsOnly','false_true'],
['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
Θα υπέθετα ότι αυτό γίνεται για να εμποδίσει τους ανθρώπους να κάνουν μια eval()
σε αυτό, αλλά το μόνο που πρέπει να κάνετε είναι να αντικαταστήσετε το while
και μετά θα είστε έτοιμοι. Θα υπέθετα ότι η αποτροπή της eval είναι για να βεβαιωθείτε ότι οι άνθρωποι γράφουν ασφαλή κώδικα ανάλυσης JSON.
Έχω δει αυτό να χρησιμοποιείται και σε μερικά άλλα μέρη, αλλά πολύ περισσότερο με το Google (Mail, Ημερολόγιο, Επαφές, κ.λπ.) Περιέργως, το Google Docs ξεκινάει με &&&&START&&&&
αντί, και το Google Contacts φαίνεται να ξεκινάει με while(1); &&&&START&&&&&
.
Τι συμβαίνει εδώ;
Αυτό γίνεται για να διασφαλιστεί ότι κάποιος άλλος ιστότοπος δεν μπορεί να κάνει άσχημα κόλπα για να προσπαθήσει να κλέψει τα δεδομένα σας. Για παράδειγμα, αντικαθιστώντας τον κατασκευαστή συστοιχίας και στη συνέχεια συμπεριλαμβάνοντας αυτή τη διεύθυνση URL JSON μέσω μιας ετικέτας <script>
, ένας κακόβουλος ιστότοπος τρίτου μέρους θα μπορούσε να κλέψει τα δεδομένα από την απάντηση JSON. Βάζοντας ένα while(1);
στην αρχή, το σενάριο θα κολλήσει αντ' αυτού.
Από την άλλη πλευρά, ένα αίτημα του ίδιου ιστότοπου που χρησιμοποιεί XHR και έναν ξεχωριστό αναλυτή JSON μπορεί εύκολα να αγνοήσει το πρόθεμα while(1);
.
Αυτό θα ήταν να δυσχεράνει την εισαγωγή της απόκρισης JSON από τρίτους σε ένα έγγραφο HTML με την ετικέτα <script>
. Θυμηθείτε ότι η ετικέτα <script>
εξαιρείται από την Πολιτική ίδιας προέλευσης.
Σημείωση: από το 2019, πολλές από τις παλιές ευπάθειες που οδήγησαν στα προληπτικά μέτρα που συζητούνται σε αυτή την ερώτηση δεν αποτελούν πλέον πρόβλημα στα σύγχρονα προγράμματα περιήγησης. Θα αφήσω την απάντηση παρακάτω ως ιστορική περιέργεια, αλλά στην πραγματικότητα το όλο θέμα έχει αλλάξει ριζικά από το 2010 (!!!) που τέθηκε το ερώτημα.
<hr>,
Αποτρέπει τη χρήση του ως στόχου μιας απλής ετικέτας <script>
. (Καλά, δεν το εμποδίζει, αλλά το κάνει δυσάρεστο.) Με αυτόν τον τρόπο οι κακοί δεν μπορούν'απλά να βάλουν αυτή την ετικέτα script στον δικό τους ιστότοπο και να βασίζονται σε μια ενεργή συνεδρία για να καταστεί δυνατή η άντληση του περιεχομένου σας.
edit — σημειώστε το σχόλιο (και άλλες απαντήσεις). Το θέμα έχει να κάνει με τις υπονομευμένες ενσωματωμένες ευκολίες, συγκεκριμένα τους κατασκευαστές Object
και Array
. Αυτοί μπορούν να τροποποιηθούν έτσι ώστε ένα κατά τα άλλα αθώο JSON, όταν αναλύεται, να μπορεί να ενεργοποιήσει κώδικα επιτιθέμενου.