Питання Чому Google приписує час (1); до своїх відповідей JSON?


Чому Google вносить до уваги? while(1); до їхніх (приватних) JSON відповідей?

Наприклад, ось відповідь під час ввімкнення та вимкнення календаря Календар Google:

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 починається з &&&START&&& замість цього, і Google Contacts, здається, починається з while(1); &&&START&&&.

Що тут відбувається?


3491
2018-04-19 18:00


походження


Я вірю, що ваше перше враження правильне. Якщо ви почнете шукати код і спробуєте обрізати вхідний потік залежно від джерела, ви переглянете його і зробите це безпечним (і внаслідок дій Google, простішим). - Esteban Küber
ймовірно, запитання про наступне: чому Google додає )]}' зараз замість while(1);? Чи будуть відповіді ті ж самі відповіді? - Gizmo
Перешкодить eval, але не з нескінченним циклом. - Mardoxx
Це )]}' також може бути збереження байтів, як Facebook for(;;); який заощаджує один байт :) - Gras Double
Для запобігання розголошення json тобто JSON hijacking - Ashraf.Shk786


Відповіді:


Це запобігає Викрадення JSON.

Приклади, що не стосуються: кажуть, що у Google є така URL-адреса, як mail.google.com/json?action=inbox який повертає перші 50 повідомлень вашої поштової скриньки у форматі JSON. Зловмисні веб-сайти інших доменів не можуть створювати запити AJAX, щоб отримати ці дані за політикою з однаковим походженням, але вони можуть містити URL-адресу за допомогою <script> тег URL-адреса відвідується з твій печиво, а також перевизначення глобального конструктора масиву або методів доступу вони можуть мати метод, який викликається кожного разу, коли встановлено атрибут об'єкта (масив або хеш), що дозволяє їм читати вміст JSON.

The while(1); або &&&BLAH&&& попереджає це: запит AJAX на mail.google.com матиме повний доступ до текстового вмісту та зможе позбавити його. Але а <script> Вставлення тегів сліпо виконує JavaScript без будь-якої обробки, в результаті чого виникає нескінченна цикл або синтаксична помилка.

Це не розглядає питання про Перехресне запит підробки.


3770
2018-04-19 18:11



Чому запит на отримання цих даних не вимагає токен CSRF? - Jakub P.
Чи for(;;); робити ту саму роботу? Я бачив це у відповідях ajax від facebook. - King Julien
@ JakubP Зберігання та підтримка CSRF-токенів у масштабах Google вимагає великої кількості інфраструктури та вартості. - abraham
@ JakubP анти-CSRF-токени зіпсуються з кешуванням і вимагають певної кількості криптографічної оцінки сервера. У масштабі Google це потребує значного обсягу процесора. Цей вид розвантажує його клієнту. - bluesmoon
Мені здається, що кращий спосіб полягає в тому, щоб дозволити серверу відправляти JSON тільки, якщо встановлено правильний заголовок. Ви можете зробити це за допомогою виклику AJAX, але не з тегами сценаріїв. Таким чином, конфіденційна інформація навіть не надсилається, і ви не повинні покладатися на безпеку веб-переглядача. - mcv


Це запобігає розголошенню відповіді за допомогою викрадення JSON.

У теорії вміст HTTP-відповідей захищається політикою Same Origin: сторінки з одного домену не можуть отримати інформацію від сторінок іншого домену (за винятком явного дозволу).

Зловмисник може запитати сторінки з інших доменів від вашого імені, наприклад, використовуючи a <script src=...> або <img>тег, але він не може отримати будь-яку інформацію про результат (заголовки, вміст).

Таким чином, якщо ви відвідуєте сторінку зловмисника, вона не може прочитати вашу електронну пошту з gmail.com.

Крім того, коли використовується тег сценарію для запиту вмісту JSON, JSON виконується як Javascript в середовищі, що керує зловмисником. Якщо зловмисник може замінити конструктор масивів або об'єктів або інший метод, який використовується під час побудови об'єкта, що-небудь у JSON пройде через код зловмисника і буде розкрито.

Зауважте, що це відбувається у той час, коли JSON виконується як Javascript, а не під час аналізу.

Існує декілька контрзаходів:

Переконайтеся, що JSON ніколи не виконує

Розмістивши a while(1); твердження перед даними JSON, Google гарантує, що дані JSON ніколи не виконуються як Javascript.

Тільки законна сторінка могла б фактично отримати весь вміст, позбавити її while(1);, і проаналізувати решту як JSON.

Все подобається for(;;); були помічені на Facebook, наприклад, з тими ж результатами.

Переконайтеся, що JSON не є дійсним Javascript

Аналогічним чином, додавши недійсні токени перед JSON, наприклад &&&START&&&, переконається, що він ніколи не виконується.

Завжди повертайте JSON з об'єктом ззовні

Це OWASP рекомендований спосіб щоб захистити від викрадення JSON, і є менш нав'язливим.

Як і попередні контрзаходи, він гарантує, що JSON ніколи не виконується як Javascript.

Дійсний об'єкт JSON, який не містить нічого, недійсний в Javascript:

eval('{"foo":"bar"}')
// SyntaxError: Unexpected token :

Проте це дійсно JSON:

JSON.parse('{"foo":"bar"}')
// Object {foo: "bar"}

Отже, переконавшись, що Ви завжди повертаєте об'єкт на верхньому рівні відповіді, переконайтеся, що JSON не є дійсним Javascript, але залишається дійсним JSON.

Як зазначає @hvd в коментарях, порожній об'єкт {} діє Javascript, і, знаючи, що об'єкт порожній, сам може бути цінною інформацією.

Порівняння вищезазначених методів

Спосіб OWASP є менш нав'язливим, оскільки не потребує змін у бібліотеці клієнта та передає дієві JSON. Це не впевнене, чи можуть минулі або майбутні помилки браузера перемогти це. Як зазначає @oriadam, незрозуміло, чи можуть дані виводитись у помилку аналізу через обробку помилок (наприклад, window.onerror).

Спосіб Google вимагає клієнтської бібліотеки, щоб він підтримував автоматичне де-серіалізацію, і його можна вважати безпечнішим щодо помилок браузера.

Обидва способи вимагають зміни на стороні сервера, щоб уникнути розробників від випадкового надсилання вразливої ​​JSON.


445
2018-02-02 12:09



Рекомендація OWASP цікава через її простоту. Хто-небудь знає причину, Google більше безпечний? - funroll
Я в це вірю це не так будь-яким способом безпечніше. Наявність OWASP тут здається достатньою підставою для +1. - vaxquis
Які веб-переглядачі в 2014 році зможуть замінити конструктор Array або Object? - Filipe Giusti
Це може бути варто відзначити чому повернення об'єкта буквально не вдається script тег або eval функція Брекети {} може інтерпретуватися як як блок коду, так і об'єкт літеральний, і сам по собі JavaScript вважає за краще колишнього. Як блок коду це, звичайно, недійсне. За цією логікою я не бачу будь-яких передбачуваних змін у майбутній поведінці браузера. - Manngo
Поганий код не достатньо, тому що зловмисник може також викрасти браузер видалення сценарію браузера (window.onerror) Я не впевнений, що таке поведінка onerror з синтаксичними помилками. Я думаю, що Google також не впевнений. - oriadam


Це потрібно для того, щоб деякі інші веб-сайти не могли робити неприємні трюки, щоб спробувати вкрасти ваші дані. Наприклад, до заміна конструктора масиву, потім включити цю URL-адресу JSON через <script> тег, зловмисний сторонний сайт може вкрасти дані з відповіді JSON. Поставивши а while(1); На початку сценарій буде зависати замість нього.

З іншого боку, запит на один сайт за допомогою XHR та окремого аналізатора JSON може легко ігнорувати while(1); префікс


344
2018-05-16 02:08



Технічно "нормальний" аналізатор JSON повинен дати помилку, якщо у вас є префікс. - Matthew Crumley
Зловмисники просто використовувати старий старий <script> елемент, а не XHR. - Laurence Gonsalves
@ Маттх, звичайно, але ви можете його видалити, перш ніж передавати дані в аналізатор JSON. Ви не можете це зробити з a <script> тег - bdonlan
Чи є приклади цього? Заміна конструктора масиву посилається знову, але це довге виправлене помилка. Я не розумію, як можна отримати доступ до даних, отриманих через тег сценарію. Я хотів би побачити манекенну реалізацію, яка працює в останньому браузері. - Dennis G
@joeltine, ні, це не так. Побачити stackoverflow.com/questions/16289894/... .


Це буде для того, щоб третій стороні було важко вставити відповідь JSON у документ HTML з <script> тег Пам'ятай, що <script> тег звільнений від Поділ Політика.


98
2018-04-19 18:04



Це лише половина відповіді. Якщо б це було не для трюку переоцінити Object і Arrayконструктори, виконуючи діючу JSON-відповідь так, якби це був JavaScript, було б абсолютно беззахисним за будь-яких обставин. Так while(1); перешкоджає виконанню відповіді як JavaScript, якщо націлена на a <script> тег, але ваша відповідь не пояснює, чому це необхідно. - Mark Amery
але як це запобіжить iframes - Ravinder Payal
@ RavinderPayal <iframe> теги не звільняються від політики аналогічного походження ... - YoYoYonnY
Тег сценарію ніколи не звільняється від такої ж політики щодо походження. Не могли б ви зрозуміти це для мене? - Suraj Jain


Це перешкоджає використанню як мета простого <script> тег (Ну, це не заважає, але це робить це неприємним.) Таким чином, погані хлопці не можуть просто розмістити цей тег сценарію на своєму власному сайті і покладатися на активний сеанс, щоб забезпечити можливість завантаження вашого контенту.

редагувати - зверніть увагу на коментар (та інші відповіді). Питання пов'язане з підробленими вбудованими об'єктами, зокрема Object і Array конструктори. Ті можуть бути змінені таким чином, що інакше нешкідливий JSON, під час аналізу, може викликати код зловмисника.


65
2018-04-19 18:02



Це лише половина відповіді. Якщо б це було не для трюку переоцінити Object і Arrayконструктори, виконуючи діючу JSON-відповідь так, якби це був JavaScript, було б абсолютно беззахисним за будь-яких обставин. Так while(1); перешкоджає виконанню відповіді як JavaScript, якщо націлена на a <script> тег, але ваша відповідь не пояснює, чому це необхідно. - Mark Amery


З моменту <script> тег звільняється від політики аналогічного походження, яка є необхідною безпекою в Інтернеті, тоді як (1) при додаванні до відповіді JSON запобігає неправильному використанню його в <script>тег


3
2017-08-18 04:14