Защо Google добавя while(1); към своите JSON отговори?

Защо 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, Calendar, Contacts и т.н.) Странно, но Google Docs започва с &&&&START&&&& вместо това, а Google Contacts изглежда започва с while(1); &&&&START&&&.

Какво се случва тук?

Това е гаранция, че някой друг сайт няма да може да използва неприятни трикове, за да се опита да открадне данните ви. Например чрез замяна на конструктора на масива, а след това включване на този JSON URL чрез таг <script>, злонамерен сайт на трета страна може да открадне данните от JSON отговора. Като поставите while(1); в началото, скриптът ще се забави вместо това.

От друга страна, заявка от същия сайт, използваща XHR и отделен JSON анализатор, може лесно да игнорира префикса while(1);.

Коментари (10)

Това би означавало да се затрудни вмъкването на JSON отговора от трета страна в HTML документ с помощта на тага <script>. Не забравяйте, че тагът <script> е изключен от Same Origin Policy.

Коментари (4)

Забележка: от 2019 г. насам много от старите уязвимости, които доведоха до обсъжданите в този въпрос превантивни мерки, вече не са проблем в съвременните браузъри. Ще оставя отговора по-долу като исторически куриоз, но наистина цялата тема се е променила радикално от 2010 г. (!!!), когато беше зададен този въпрос.


Това не позволява да се използва като цел на обикновен таг <script>. (Е, не го предотвратява, но го прави неприятно.) По този начин лошите хора не могат просто да'поставят този таг script в собствения си сайт и да разчитат на активна сесия, за да направят възможно извличането на вашето съдържание.

edit — обърнете внимание на коментара (и на другите отговори). Въпросът е свързан с подменени вградени средства, по-конкретно конструкторите Object и Array. Те могат да бъдат променени по такъв начин, че иначе безобиден JSON, когато бъде анализиран, да задейства код на атакуващия.

Коментари (1)