Kāpēc Google savās (privātajās) JSON atbildēs pievieno while(1);
?
Piemēram, šeit ir atbilde, kamēr ieslēdz un izslēdz kalendāru Google Calendar:
while(1);[['u',[['smsSentFlag','false'],['hideInvitations','false'],
['remindOnRespondedEventsOnly','true'],
['hideInvitations_remindOnRespondedEventsOnly','false_true'],
['Calendar ID stripped for privacy','false'],['smsVerifiedFlag','true']]]]
Es pieņemu, ka tas ir tāpēc, lai novērstu iespēju cilvēkiem veikt eval()
, bet viss, kas jums patiešām būtu jādara, ir jāaizstāj while
, un tad jūs būtu gatavs. Es pieņemu, ka eval novēršanas mērķis ir nodrošināt, lai cilvēki rakstītu drošu JSON analizēšanas kodu.
Es esmu redzējis, ka tas tiek izmantots arī dažās citās vietās, bet daudz vairāk Google (Mail, Calendar, Contacts utt.) Dīvainā kārtā Google Docs tā vietā sākas ar &&&&START&&&&&&&
, un Google Contacts, šķiet, sākas ar while(1); &&&&&&START&&&&&
.
Kas šeit notiek?
Tas ir, lai nodrošinātu, ka kāda cita vietne nevar veikt nepatīkamus trikus un mēģināt nozagt jūsu datus. Piemēram, aizstājot masīva konstruktoru un pēc tam iekļaujot šo JSON URL, izmantojot <script>
tagu, ļaunprātīga trešās puses vietne varētu nozagt datus no JSON atbildes. Ievietojot sākumā while(1);
, skripts tiks apturēts.
No otras puses, vienas un tās pašas vietnes pieprasījums, izmantojot XHR un atsevišķu JSON analizatoru, var viegli ignorēt while(1);
prefiksu.
Tas nozīmē, ka trešās puses varētu apgrūtināt JSON atbildes ievietošanu HTML dokumentā, izmantojot <script>
birku. Atcerieties, ka <script>
birka ir atbrīvota no Same Origin Policy.
Piezīme: kopš 2019. gada daudzas no vecajām ievainojamībām, kuru dēļ tika veikti šajā jautājumā aplūkotie preventīvie pasākumi, mūsdienīgās pārlūkprogrammās vairs nav aktuālas. Atbildi zemāk atstāju kā vēsturisku interesantu informāciju, taču patiesībā kopš 2010. gada (!!!), kad tika uzdots šis jautājums, visa tēma ir radikāli mainījusies.
Tas neļauj to izmantot kā vienkāršas <script>
birkas mērķi. (Nu, tas to neaizkavē, bet padara to nepatīkamu.) Tādā veidā ļaundari nevar vienkārši ievietot šo skripta tagu savā vietnē un paļauties uz aktīvu sesiju, lai varētu iegūt jūsu saturu.
edit — ņemiet vērā komentāru (un citas atbildes). Problēma ir saistīta ar apgāztām iebūvētajām iespējām, konkrēti Object
un Array
konstruktoriem. Tos var izmainīt tā, ka citādi nekaitīgs JSON, to analizējot, var iedarbināt uzbrucēja kodu.