Защо 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);
.
Това би означавало да се затрудни вмъкването на JSON отговора от трета страна в HTML документ с помощта на тага <script>
. Не забравяйте, че тагът <script>
е изключен от Same Origin Policy.
Забележка: от 2019 г. насам много от старите уязвимости, които доведоха до обсъжданите в този въпрос превантивни мерки, вече не са проблем в съвременните браузъри. Ще оставя отговора по-долу като исторически куриоз, но наистина цялата тема се е променила радикално от 2010 г. (!!!), когато беше зададен този въпрос.
Това не позволява да се използва като цел на обикновен таг <script>
. (Е, не го предотвратява, но го прави неприятно.) По този начин лошите хора не могат просто да'поставят този таг script в собствения си сайт и да разчитат на активна сесия, за да направят възможно извличането на вашето съдържание.
edit — обърнете внимание на коментара (и на другите отговори). Въпросът е свързан с подменени вградени средства, по-конкретно конструкторите Object
и Array
. Те могат да бъдат променени по такъв начин, че иначе безобиден JSON, когато бъде анализиран, да задейства код на атакуващия.