Zakaj Google v svoje (zasebne) odgovore JSON dodaja while(1);
?
Na primer, tukaj je odgovor med vklopom in izklopom koledarja v Googlovem koledarju:
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
['remindOnRespondedEventsOnly','true'],
['hideInvitations_remindOnRespondedEventsOnly','false_true'],
['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
Predvidevam, da je namen tega preprečiti ljudem, da bi na njem izvajali eval()
, vendar bi morali v resnici le zamenjati while
in potem bi bilo vse pripravljeno. Predvidevam, da je namen preprečevanja eval-a zagotoviti, da ljudje pišejo varno kodo za razčlenjevanje JSON-a.
To sem opazil tudi na nekaj drugih mestih, vendar veliko bolj pri Googlu (pošta, koledar, stiki itd.) Nenavadno je, da se Google Docs namesto tega začne z &&&&START&&&&&
, Google Contacts pa z while(1); &&&&START&&&&
.
Kaj se tu dogaja?
S tem zagotovite, da kakšno drugo spletno mesto ne bo moglo poizkušati ukrasti vaših podatkov z grdimi triki. Na primer, z zamenjavo konstruktorja polja in vključitvijo tega naslova URL JSON prek oznake <script>
lahko zlonamerno spletno mesto tretje osebe ukrade podatke iz odgovora JSON. Če na začetek postavite while(1);
, se bo skript namesto tega ustavil.
Po drugi strani pa lahko zahteva istega spletnega mesta, ki uporablja XHR in ločen razčlenjevalnik JSON, predpono while(1);
enostavno prezre.
S tem bi tretjim osebam otežili vstavljanje odgovora JSON v dokument HTML z oznako <script>
. Ne pozabite, da je oznaka <script>
izvzeta iz politike istega izvora.
Note: od leta 2019 številne stare ranljivosti, ki so privedle do preventivnih ukrepov, obravnavanih v tem vprašanju, v sodobnih brskalnikih niso več problematične. Spodnji odgovor bom pustil kot zgodovinsko zanimivost, vendar se je celotna tema od leta 2010 (!!!), ko je bilo postavljeno to vprašanje, res korenito spremenila.
Preprečuje, da bi ga uporabili kot tarčo preproste oznake <script>
. (No, tega ne preprečuje, vendar je neprijetno.) Na ta način zlobneži te skriptne oznake ne morejo preprosto namestiti na svoje spletno mesto in se zanašati na aktivno sejo, da bi lahko pobrali vašo vsebino.
edit — upoštevajte komentar (in druge odgovore). Vprašanje je povezano s prevrnjenimi vgrajenimi zmogljivostmi, zlasti konstruktorjema Object
in Array
. Te je mogoče spremeniti tako, da lahko sicer neškodljiv JSON ob razčlenjevanju sproži napadalčevo kodo.