Чому 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
, і тоді все буде готово. Я б припустив, що запобігання перевірці полягає в тому, щоб переконатися, що люди пишуть безпечний код розбору JSON.
Я бачив, як це використовується в декількох інших місцях, але набагато більше в Google (пошта, календар, контакти і т.д.) Як не дивно, Google Docs починається з &&&&START&&&
, а Google Contacts, здається, починається з while(1); &&&&START&&&&]
.
Що тут відбувається?
Це робиться для того, щоб гарантувати, що якийсь інший сайт не зможе зробити неприємні трюки, щоб спробувати вкрасти ваші дані. Наприклад, шляхом заміни конструктора масиву, а потім включення цієї URL-адреси JSON через тег <script>
, зловмисний сторонній сайт може вкрасти дані з відповіді JSON. Якщо поставити на початку тег while(1);
, то замість цього скрипт зависне.
З іншого боку, запит з того ж сайту, що використовує XHR і окремий парсер JSON, може легко проігнорувати префікс while(1);
.
Це робиться для того, щоб ускладнити для третьої сторони вставку JSON-відповіді в HTML-документ за допомогою тегу <script>
. Пам'ятайте, що на тег <script>
не поширюється дія Same Origin Policy.
Примітка: станом на 2019 рік багато старих вразливостей, які призводять до превентивних заходів, що обговорюються в цьому питанні, вже не є проблемою в сучасних браузерах. Я залишу відповідь нижче як історичну цікавинку, але насправді вся тема радикально змінилася з 2010 року (!!), коли це питання було поставлено.
Це заважає використовувати його в якості цілі простого тегу <script>
. (Ну, не заважає, але робить це неприємним.) Таким чином, погані хлопці не можуть просто поставити цей тег script на свій сайт і покладатися на активну сесію, щоб отримати ваш контент.
редагувати — зверніть увагу на коментар (та інші відповіді). Проблема пов'язана з підміненими вбудованими засобами, а саме конструкторами Object
та Array
. Вони можуть бути змінені таким чином, що нешкідливий JSON при розборі може викликати код зловмисника.