Зачем Google добавляет while(1); к своим JSON-ответам?

Автор оригинала: Rjh
  • Перевод
Это позволяет избежать CSRF/XSRF-атак (подделки межсайтовых запросов).

Рассмотрим следующий пример: допустим у Google есть URL вида gmail.com/json?action=inbox, который возвращает 50 первых сообщений вашего почтового ящика в формате JSON. Злоумышленник, чей сайт находятся на другом домене, не может выполнить AJAX запрос, обратившись по данному URL, чтобы получить данные, ввиду same origin policy (правило ограничения домена). Но ничто не мешает злоумышленнику включить вышеуказанный URL на свою страницу с помощью тега .

Данному URL будут переданы куки, сохранённые в вашем браузере для домена gmail.com. Путём переопределения глобального конструктора array или методов доступа злоумышленник может вызывать произвольный метод всякий раз, когда устанавливается атрибут объекта (массива или хэша), тем самым получая доступ к содержимому JSON.

Конструкция while(1); или &&&BLAH&&& позволяет этого избежать. Gmail.com при отправке AJAX-запросов имеет полный доступ к содержимому ответа и благополучно эту дополнительную конструкцию вырезает. Тег же выполняет JavaScript без какой-либо предварительной обработки, в результате чего, происходит либо бесконечный цикл (для while(1);) или синтаксическая ошибка (для &&&BLAH&&&).

[ Источник ]

UPD:
Информация от пользователя d00kie:

Это атака — JSON Hijacking, была блокирована в 2007/2008 производителями браузеров. Так что, в данном случае это «страховка» на случай, если изобретут новый способ перехвата и осталось «с тех времен», ибо хуже не будет. То, что в статье на столько старо, что с тех пор, как переопределяли Array() уже был «изобретён» новый способ (после фикса 2007 надо было найти новый способ и его нашли):

Object.prototype.__defineSetter__('Id', function(obj){alert(obj);});


И он тоже уже пофиксен в фаерфоксе версии >3.0.11…
Всё это история.
Поделиться публикацией
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 145

    +12
    Красивое решение. Но получается эта техника позволяет какому угодно сайту получить доступ к моим персональным данным, если они возвращаются любым другим сервером в виде JSON?
      +1
      Получается так.
        +7
        Нет. Не надо паники. Нельзя.
        +2
        Только если для получения JSON используется GET. Именно поэтому в ASP.NET MVC дефолтное поведение для REST-методов — JsonRequestBehavior.DenyGet.
        stackoverflow.com/a/8464685/236660
          +2
          Я так понимаю, что еще красивее от этого можно защититься передавая токен сессии не в куках, а параметром
            0
            дефолтное поведение для REST-методов

            Значит я должен list post'ом делать? Это кажется нелогичным костылем.
              0
              С точки зрения архитектуры REST — да. Но если принять во внимание наличие уязвимости, то её нельзя оставлять открытой :)
              С другой стороны, там внизу пишут, что браузеры уже закрыли уязвимость какое-то время назад. Не знаю, насколько это соответствует реальности.
            0
            Это не «эта техника», это абсолютно любой сайт, который использует любую из реализаций «remember me» с помощью куков.

            Если вы сможете из пользовательского браузера выполнять запросы хоть куда и полностью контролировать процесс обработки ответа — тогда вы сможете делать что угодно от имени пользователя.
              +3
              Нельзя. Пофиксино в браузерах. Давно.
                0
                И все такие взяли и обновились до последней версии, да?
                  +5
                  Это не последняя версия. Фикс был в 2007 году. Думаю 6 лет слоупокства — это уже провал.
                    +1
                    Не знаю как сейчас, но в 2009 году этот же приём работал в сочетании с __defineSetter__ — в Хроме и FF.
                    haacked.com/archive/2009/06/25/json-hijacking.aspx
                      0
                      Да, я писал об этом ниже. Зафиксино тогда же в 2009.
              +1
              А прервать выполнение скрипта из другого скрипта нельзя? А потом поиметь доступ к переменным.
                +4
                Firefox сам предложит остановить выполнение скрипта.

                Вместо while(1); можно использовать for(;;); — на один байт короче :)
                  0
                  Имеется ввиду с целью CSRF/XSRF, дабы обойти защиту гугла в JSON.
                    0
                    Нельзя. Вы вообще никак процессом загрузки и исполнения скрипта не можете управлять
                    0
                    на один байт короче и в 2 раз больше магии + намерения пограммиста не очевидны
                      +6
                      Какая магия? for(;;) — это же классический бесконечный цикл
                • НЛО прилетело и опубликовало эту надпись здесь
                    +2
                    Функции можно переопределить. while — нельзя :)
                    • НЛО прилетело и опубликовало эту надпись здесь
                        +9
                        надо учитывать и такое.
                        Учитывать, что кому-нибудь всё-таки удастся переопределить while? :)
                        • НЛО прилетело и опубликовало эту надпись здесь
                            +4
                            Речь в статье идёт о JSON-данных, а не о js-скриптах.
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                Я вас не минусовал :) Вот, даже плюсанул.
                                Но мне кажется, что в комментарии, на который вы отвечали, подразумевалось прерывание кода, который инициализирует массив из JSON-данных. Могу ошибаться.
                      0
                      Тем не менее, если сделать какой-нибудь setTimeout, а потом сделать какой-нибудь window.stop (document.execute(«stop»)?), то не случиться ли чуда?
                      • НЛО прилетело и опубликовало эту надпись здесь
                          0
                          Т.е. запустить асинхронно другой скрипт и прервать выполнение скриптов вообще никак нельзя?
                            +3
                            Даже если и можно, прервав выполнение, Вы остановите скрипт до объявления структур с полезной информацией.
                              +1
                              А вам не нужно прерывать выполнение скрипта, вам нужно прервать выполнение конкретной (первой) инструкции и продолжить. Что звучит (и по факту) абсолютно нереально.
                              • НЛО прилетело и опубликовало эту надпись здесь
                                  0
                                  А, ну да. Если while в начале, то прерывать бесполезно — он же её не отработал.
                                  +2
                                  Нельзя. JS выполняется в один поток. Пока один блок кода не отработает, другой не начнет свою работу
                                      0
                                      Кроме Rhino — там можно, поскольку он построен поверх Java Runtime где есть многопочная модель.
                                        0
                                        Вы хотели сказать «многопочечная»? :)
                                          0
                                          многопоточная, не заметил опечатки — но думаю что из контекста это и так понятно
                                            0
                                            Конечно, понятно. Пошутил, тоже думал, что понятно.
                                          +1
                                          Вы уверены? Там есть потоки?
                                            0
                                            Использовал Rhino — делал честное многопоточное приложение — 10 рабочих процессов с локом конвеера для каждого.

                                            Если не верите мне то…

                                            // целевой класс org.qxfusion.EngineInfo
                                            // запускать так $ java org.qxfusion.EngineInfo.class
                                            package org.qxfusion;
                                            import java.util.*;
                                            import javax.script.*;
                                            public class EngineInfo {
                                                public static void main( String[] args ) {
                                                    ScriptEngineManager mgr = new ScriptEngineManager();
                                                    List<ScriptEngineFactory> factories = mgr.getEngineFactories();
                                                    for ( ScriptEngineFactory factory : factories ) {
                                                        System.out.println( String.format(
                                                                "engineName: %s, THREADING: %s",
                                                                factory.getEngineName(),
                                                                factory.getParameter( "THREADING" ) ) );
                                                    }
                                                }
                                            }
                                            

                                              0
                                              Гм… <капитан>это же не JavaScript</капитан> :)

                                              Т.е. вы из Java запускаете интерпретаторы, каждый — отдельный процесс?
                                                0
                                                Вы вообще знаете что такое Mozilla Rhino? (многие путают с Mozilla Gecko — но это разные движки)

                                                Зачем запускать новые копии ScriptEngine?

                                                importPackage(java.lang); // куда же без него
                                                
                                                var threadMain = function(a) {  while(true) { print("Thread "+a); } } // вечный цикл
                                                
                                                var thread1 = function() { return threadMain(1); } // поток 1
                                                var thread2 = function() { return threadMain(2); } // поток 2
                                                
                                                // конструктор объекта потока
                                                var newThread = function(fn) {
                                                  return new java.lang.Thread( new java.lang.Runnable( { run: fn } ) );
                                                }
                                                
                                                var th1 = newThread(thread1); th1.start();
                                                var th2 = newThread(thread2); th2.start();
                                                
                                                // на выходе - честная работа 2 потоков (если не верите - смотрим отладчик)
                                                
                                                




                                                  0
                                                  Ну ок, с Rhino все приблизительно понятно.

                                                  Просто я немного не могу осознать как это согласуется с моделью работы стандартного JavaScript интерпретатора, где асинхронные методы отрабатывают по очереди.
                                                    0
                                                    Стоп, стоп, стоп.
                                                    Речь сейчас идет о Mozilla Rhino — он построен поверх Java где есть транзакционность данных и честная многопоточность — поэтому тут этой проблемы нету.
                                                    P.S. а Вы знаете что на Rhino есть Web серверы? по скорости он уступает V8 (JRE дает о себе знать) — но зато (1) лучше масштабируется (2) не нужны спагетти из callback (3) транзакционность присваиваний в многопоточной среде
                                                    P.P.S. ну и еще от меня — Rhino можно запустить и на QNX тоже — т.к. под нее есть JRE (от IBM) — а вот node.js не собирается там :(
                                                      0
                                                      >… поэтому тут этой проблемы нету.

                                                      Ну это не проблема-то собственно, просто другой подход.

                                                      > а Вы знаете что на Rhino есть Web серверы?

                                                      Это прекрасно, но по мне для этих целей лучше просто взять саму Jav'у или Scal'у, или Groovy.
                                                        0
                                                        1) Кому как
                                                        2) если Вы хотите писать на серверную часть JavaScript — то выбор у Вас небольшой — или node.js/V8 или java/Rhino
                                                      0
                                                      Стандартный JavaScript — Вы подразумеваете ECMAScript Standart или какой-либо другой?
                                                      Поочередная модель обработки вызовов это специфика не языка, а конкретной реализации среды выполнения — т.е. движке интерпретатора.
                                                        0
                                                        Да, вы правы.
                                                          0
                                                          * standard
                                      0
                                      while — конструкция языка, зарезервированное слово, разве можно её переопределить?
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                      –22
                                      ну придется им парсер не сложный написать или использовать готовый… Прям такая защита, что ни обойти, ни объехать. Только жизнь усложняют тем, кто по назначению использует.
                                      • НЛО прилетело и опубликовало эту надпись здесь
                                          –24
                                          А что сорцы браузеров/JS движков уже закрыли?
                                          Правда такая атака уже не для школяров.
                                            +22
                                            Очевидно, что если вы сможете пользователю подсунуть свой браузер — то не нужно особо париться. Вы в принципе тогда сможете встроить в него код, позволяющий делать что угодно с чем угодно.
                                              –8
                                              Достаточно украсть куки? Если у юзера не включена 2х уровневая авторизация.
                                              Т.е. у Гугла есть противодействие и на это. На других сайтах, где используют такой же трюк видимо будет достаточно украсть сессию/куки.
                                                +8
                                                Не нужно ничего воровать — если вы смогли пользователю установить свой браузер, то можно просто использовать его как прокси.
                                                  0
                                                  От кражи кук более-менее спасают CSRF токены
                                                    +1
                                                    Как?
                                                      0
                                                      CSRF токен — это особое поле в запросе или вызове API которое должно или (1) соответстветствовать значению токена в сессии (например PHPSESSID) или (2) закрытому (секретному) значение сессии на сервере — в случае несовпадения — запрос не выполняется.
                                                        0
                                                        Оооооооооок, но:

                                                        1. Приложение должно знать значение CSRF-токена
                                                        2. Находим XSS
                                                        3. Реализуем код для парсинга токена
                                                        4. Отправляем запрос

                                                        5. Где защита???
                                                          –2
                                                          Учитывая что Ваш коммент плюсанули — видно кто-то не знает мат. часть тоже.
                                                          Собственно прежде чем нести непонятно что — прочтите en.wikipedia.org/wiki/Cross-site_request_forgery
                                                          Давайте так — вот Вам список сайтов:
                                                          (1) www.live.com/
                                                          (2) www.gmail.com/
                                                          … думаю пока хватит…

                                                          Сделаете для них CSRF — и нет проблем :)
                                                          P.S. если не осилите — у меня еще есть уйма сайтов на попробывать
                                                            0
                                                            Это всё прекрасно, но как всё-таки CSRF-токены спасают от кражи кук? (напомню, что в этой ветке мы обсуждаем «От кражи кук более-менее спасают CSRF токены»)
                                                              0
                                                              «Собственно прежде чем нести непонятно что» — собственно, товарищ выше всё правильно написал — если есть XSS, то можно токен из страницы получить.

                                                              Если вы не согласны — будьте немного более конкретны и укажите, в чём именно человек ошибся.
                                                                0
                                                                (1) не путайте CSRF и XSS — т.к. XSS дает по сути контекст пользователя
                                                                (2) CSRF токен позволяет блокировать выполнение команды (запроса) без наличия валидного токена — таким образом просто сделав фэйковый редирект запрос не выполниться, таким образом если на сайте НЕТУ XSS то эксплуатация CSRF не выйдет — т.к. токен не получить.
                                                                Кража куки — это когда другой пользователь или скрипт минуя пользователя выполняет от его лица вредоносный запрос (например накрутить голоса, разместить комментарий и т.д.)
                                                                Про XSS можете прочесть тут — ru.wikipedia.org/wiki/XSS
                                                                P.S. нахождение XSS это большая удача — которую далеко не всегда можно найти.
                                                                  +1
                                                                  Мы и не путали. Изначальный вопрос был «От кражи кук более-менее спасают CSRF токены»

                                                                  Предполагается, что куки будут сворованы активным XSS. Если XSS есть, тогда CSRF-токены от кражи кук (и вообще чего бы то ни было) не спасают.

                                                                  С этим вы согласны?

                                                                  >> Кража куки — это когда другой пользователь или скрипт минуя пользователя выполняет от его лица вредоносный запрос

                                                                  Я боюсь, что вы неправы. Кража куки — это «кража куки», в буквальном смысле получение данных куки другим лицом. Выполнение вредоносного запроса от лица пользователя это не кража, а, к примеру, упомянутая выше атака типа CSRF.
                                                                +3
                                                                Whaaaaaaatt?!? Закройте Хабр и учите терминологию.
                                                                  –5
                                                                  Рекомендую Вам сначала выучить русский язык, ибо судя по комменту смысл некоторых слов Вам не совсем понятен.
                                                                    +1
                                                                    Вы еще здесь!? Выведите кто-нибудь его, пожалуйста!
                                                          +3
                                                          Вас уже в твиттере цитируют, в курсе?)
                                                            0
                                                            Люди цитируют всё подряд :-) Потому к прочитанному всегда нужно относиться скептически
                                                            +1
                                                            CSRF-токены спасают от CSRF-атак, от кражи кук они не спасают и не должны.

                                                            Если злоумышленник смог своровать куку, то может своровать и токен.
                                                              –2
                                                              Это если кража идет постоянно.
                                                              Если токены сделаны нормально (постоянно обновляются при каждом запросе) и между кражей и использованием кук клиент успевает наделать еще запросов, ворованный токен протухает. И наоборот, если вор юзает токен, у клиента вылезает «опаньки, иди-ка перелогинься», что есть повод задуматься как минимум или хотя бы сбросить ворованую серию токенов.
                                                                0
                                                                Перегенерация токенов на каждый запрос больше принесёт вреда, чем пользы.

                                                                С одной стороны она создаёт иллюзию защищённости (вы надеетесь, что текущий запрос клиента будет не последним, иначе «ой»). С другой стороны — проект перестанет работать, будучи открытым в нескольких вкладках одновременно. И решать эту проблему вы будете созданием не 1 токена, а кучи разных, по одному на форму, страницу, раздел, итд, на что фантазии хватит. И будете их со слезами поддерживать.
                                                                  –1
                                                                  Страницы? Вкладки? Разделы? Не, не слышал. Вы про каменный век что ли?
                                                                    0
                                                                    Вместо того, чтобы ёрничать, могли бы написать по сути, в чём я не прав (если есть что писать, конечно же).
                                                                      0
                                                                      Ну я вот как-то не встречал например банковского софта, позволяющего работать в несколько вкладок. Гугловские приложения в принципе это позволяют, но по факту там полностью новая сессия загружается для каждой вкладки. Ну и вообще, современные AJAX-приложения, как правило, одностраничные.
                                                                        +1
                                                                        RIA не панацея. Хабр — многостраничный. Если вы сделаете так, как вы предложили, на Хабре, то он сломается.

                                                                        Про банковский софт — банкинг, которым я пользуюсь, позволяет работать в нескольких вкладках.
                                                                        Когда я работал в банке и мы писали приклад для операционистов — он тоже работал в нескольких вкладках.
                                                                          0
                                                                          Хабр — сайт. С элементами, но не более.
                                                                          Я про приложения. GMail, Office365, ДБО, вот это всё.
                                                                          «Позволяет работать» — может быть. Я не знаю, как там реализована защита от CSRF, я не знаю, как реализовано открытые вкладок, ну и вообще в этом нет принципиально невозможного.
                                                                            +1
                                                                            Защита от CSRF реализуется с помощью CSRF-токенов. Потому они и называются CSRF-токенами, что защищают от CSRF-атак. С помощью них НЕ защищаются от кражи кук.

                                                                            В RIA, в свою очередь, тоже нет смысла изобретать что-то новое на коленке, потому что есть, как минимум, OAuth
                                                                              –3
                                                                              Нормально реализованные CSRF токены защищают в том числе от кражи кук, кроме случая, когда кража идёт в реальном времени.
                                                                              Ничего нового тут изобретать не нужно, достаточно прямыми руками реализовать.
                                                                              OAuth тут вообще не при чем; даже если его нет, сервис авторизации всё равно лучше делать как отдельный сервис на отдельном поддомене и отдельном сервере (возможно виртуальном) с отдельной же базой данных.
                                                                                0
                                                                                >> кроме случая, когда кража идёт в реальном времени.

                                                                                Решения или работают, или не работают. Если для того, чтобы ваш клиент был защищён — он обязан бесконечно кликать и никогда не уходить с вашего сайта, то это не защита, а лишь иллюзия.

                                                                                Прямость рук тут вообще ни при чём, это решение принципиально работает плохо (я уже несколько раз говорил о работе в нескольких вкладках, которые вы так упорно отрицаете).

                                                                                >> сервис авторизации всё равно лучше делать как отдельный сервис на отдельном поддомене и отдельном сервере

                                                                                Вы не путаете «авторизацию» с «аутентификацией»?

                                                                                Так или иначе, расскажите как реализовать их «правильно», чтобы они работали на любом сферическом сайте, предположим, на хабре.
                                                                                  0
                                                                                  Да не надо пользователю никуда кликать или «не уходить», если программист что-то слышал про очереди. И вкладки тоже не проблема, если он умеет работать с HTTP протоколом. Под авторизацией в широком смысле сегодня понимают весь процесс идентификации, аутентификации и авторизации пользователя. И да, если хакер впарил жертве трояна с функцией удаленного рабочего стола, то возможностями одного только браузера не защититься.
                                                                                  С уважением, ваш Кэп.
                                                                                    0
                                                                                    Вы говорите слишком общие вещи. «Если программист что-то слышал про очереди», «если руки прямые», «если умеет работать с HTTP».

                                                                                    Вы можете конкретно описать процесс, не юля и без прибауток про капитана?

                                                                                    Есть сайт — хабр. Ваше решение?

                                                                                    ps: каким боком тут «очереди» — непонятно (разве что вы опять, как и в случае с CSRF-токеном, термин использовали не к месту)
                                                                                      0
                                                                                      Вы просите конспект книжки «безопасность веб-приложений для гуманитариев».
                                                                                      Будет время — может и напишу отдельным постом. Но вообще ничего сложного нет, следуй стандартам и на каждом шаге проверяй всё, что присылает клиент.
                                                                                      Вкратце есть три куки, одна — токен сессии пользователя, вторая — токен окна в рамках сессии, третья — токен следующей операции в рамках окна (и да, доп. поля под токены в формах вручную заводят разве что в джумле. И то вроде уже отказались). Дальше нужно просто всё аккуратно реализовать с учетом стандартов и особенностей работы в сети, когда некоторые запросы могут подвисать.
                                                                                        0
                                                                                        Что мешает все три своровать и использовать в своих грязных целях?

                                                                                        Как вы отличите «настоящего» клиента от злоумышленника, при том что и тот, и другой отправят вам одинаковые наборы куков?
                                                                                          –2
                                                                                          Ну например то, что первая кука привязана к браузеру и айпишнику, вторая — к окну, а третья обновляется при каждой операции.
                                                                                          Да, насчет очередей: принцип тот же, что и в электронных брелках для генерации одноразовых паролей. Вы в банке точно программистом работали?
                                                                                            +2
                                                                                            Если у вас есть кука, которая привязывается к паре браузер-ip, тогда вам не нужна вторая оконная. Она не добавляет к безопасности вообще ничего (только иллюзию, что чем больше кук, тем всё лучше защищено).

                                                                                            Собственно, то, о чём вы сейчас говорите — стандартная защита от session fixation (и ряда родственных атак), и это всё ни с CSRF, ни с CSRF-токеном никак не связано. Вы уверены, что вы продолжаете отвечать на заданный изначально вопрос? Всё таки, пересмотрите, пожалуйста, этот тредик с самого начала.

                                                                                            Про очереди — как только вы перестанете выдумывать термины на ходу, а использовать устоявшиеся, вас сразу начнут понимать.
                                                                                              0
                                                                                              Вторая кука нужна как раз для вкладок и окон, потому что у них третьи куки разные.
                                                                                              Насчет терминов — я не знаю другого перевода для queue
                                                                                                0
                                                                                                Зачем конкретно она нужна? Что именно с точки зрения безопасности вторая и третья куки добавляют? Что изменится, с точки зрения безопасности, если их не будет?
                                                                                                  0
                                                                                                  Простите, я устал.
                                                                                                  Эти куки защищают именно от CSRF, когда некто может вставить свой код, делающий запросы на атакуемый сайт, в html-код стороннего сайта и заманить туда жертву, залогиненную на атакуемом сайте. Как раз случай, рассматриваемый в этой статье.
                                                                                                  Если речь, допустим, о рассылке спама (GMail в контексте этой статьи; была именно такая дырка на мейл.ру), это остановит рассылку в худшем случае через 1 письмо.
                                                                                                  Если более серьезное приложение, скажем платежная система, то каждая критическая операция должна дополнительно защищаться внешним одноразовым паролем. Если все такие операции снабжаются подобным паролем, то да, вторая и третья куки не нужны.
                                                                                                    0
                                                                                                    Спасибо: теперь ваша точка зрения понятна.
                                                                                                      +1
                                                                                                      >> Простите, я устал.

                                                                                                      Вы бы не устали, если бы не растекались мыслью по дереву и не уходили от темы.

                                                                                                      Я сейчас тезисно изложу, чтобы вы поняли, что именно вы делаете не так:

                                                                                                      1. CSRF-токен не обязан защищать от воровства кук, он лишь защищает от CSRF-атак. Реализация: рандомный сессионный токен
                                                                                                      2. От воровства кук защищаемся запоминая в сессии ip и браузер клиента (самый примитивный вариант).

                                                                                                      Итого:
                                                                                                      1. Это 2 разных способа защиты, которые между собой никак не связаны
                                                                                                      2. Наличие одного не подразумевает наличие другого. Именно поэтому фраза «CSRF-токены защищают от воровства кук» некорректно. Не защищают они, защищают другие решения
                                                                                                      3. 3 куки не нужны, 1 достаточно, чтобы иметь приложение защищённое как и ваше
                                                                                    +2
                                                                                    > Нормально реализованные CSRF токены защищают в том числе от кражи кук
                                                                                    А объясните на пальцах? Лучше диаграммой взаимодействия. Моя вас не понимать.
                                                                                      0
                                                                                      Scroll up plz
                                                                                        0
                                                                                        Готово. Я не увидел диаграмму взаимодействия, а только панельку свою.

                                                                                        Осторожно! Большая широкоформатная картинка
                                                                                        image
                                                                      0
                                                                      о каком токене идет речь? csrf token, signed cookie, sid?
                                                                      csrf токен обновлять нет абсолютно никакого смысла. его можно украсть только через XSS и использовать только когда юзер на вашей странице. А значит пока XSS работает то он может получать новые сгенеренные токены
                                                                      другое дело access_token
                                                                        0
                                                                        Вот честно, я не знаю, как называется правильная реализация токенов. Я знаю, как она делается.
                                                                          0
                                                                          Ну так и расскажите тогда, своими словами, а мы дальше выберем, какой из терминов подходит лучше
                                                                            0
                                                                            Чуть повыше почитайте плз.
                                                                              0
                                                                              зато я прекрасно знаю. от кражи токенов спасает защита от XSS, а сами токены спасают от использования кук для CSRF.
                                                                  +15
                                                                  И кого этот «не школяр» сможет атаковать своим патченым браузером? Себя?
                                                                  • НЛО прилетело и опубликовало эту надпись здесь
                                                                0
                                                                Там где предполагается «по назначению», очевидно, такое вставляться не будет.
                                                                  0
                                                                  Для использования «по назначению» делают API.
                                                                  +8
                                                                  Другой вариант от гугла — )]}' в начале ответа.
                                                                    –3
                                                                    в начале JSON ответа? а еси попарсить и каким-то eval заюзать?
                                                                      0
                                                                      В случае, если данные лежат на другом домене, Вы никак не получите их текстом. Можно будет выполнить их, но от простого объявления ничего не случится (но случилось бы в далёком 2007 при описанной выше схеме).
                                                                    +2
                                                                    можно писать просто /* тогда все будет комментарием.
                                                                    и вообще тема стара как мир, уже года 4 как запретили переопределять Array конструктор.
                                                                      +1
                                                                      А что-то вроде
                                                                      defineSetter( Object, { 
                                                                        user: function (user) {    
                                                                          // get user here
                                                                        }
                                                                      });
                                                                      
                                                                        0
                                                                        такое было раньше в фф как алексей ниже написал. пофиксили конечно, любой {hash} бросит синтакс ошибку
                                                                          0
                                                                          А что именно запретили? Потому что геттеры в прототип массива я добавлял.
                                                                      –6
                                                                      Путём переопределения глобального конструктора array или методов доступа злоумышленник может вызывать произвольный метод всякий раз, когда устанавливается атрибут объекта (массива или хэша), тем самым получая доступ к содержимому JSON.
                                                                      Нет не может, см. тоже самое правило. А конкретней — либо переопределение не будет допущено политиками броузера, либо javascript со стороны хакерского сайта не получит доступ к объектам из <script> другого сайта (все тот же кроссдомен).

                                                                      Гугль и другие делают это по другим причинам:
                                                                      — XSS, SQL и другие инъекции позволяещие хоть в какой-то мере cross-site scripting (ошибка разработчика сайта);
                                                                      — браузер пишут тоже люди, и некоторые используют бета-версии, например nightly (ошибка разработчика браузера);
                                                                      — есть люди по разным причинам допускающие у себя кроссдомен javascript (человеческий фактор);

                                                                      Одного XSRF в нормальном виде однозначно не достаточно.

                                                                      Как-то так.
                                                                        0
                                                                        Вы не правы. <script src= будет исполнен в контексте основного домена, не важно с какого домена грузится скрипт. Но для доступа к скрипту будут использованы куки нужного хоста.
                                                                          –7
                                                                          Да нет, это вы не правы — скипт будет выполнен, и куки будут нужные. НО страничка, откуда был вызван скипт, НИКОГДА (кроме 3-х причин описаных выше) не получит данные из этого скрипта.
                                                                          А вы попробуйте как нибудь эту технику и убедитесь, что такое не возможно.

                                                                          UPD. вы же сами это признали комментом ниже
                                                                            0
                                                                            у вас беспорядок в суждениях. скрипт это скрипт, в нем нет никаких объектов. крос домен тут вообще не причем, тк даже если вы будете грузите такой же скрипт со своего домена вы также не сможете прочитать хеш. крос домен распростроняется только на доступы между разными ориджинами и фреймами, и на скрос доменные запросы. на своей странице вы вольны выполнять скрипты с google.com
                                                                              –2
                                                                              скрипт это скрипт, в нем нет никаких объектов
                                                                              Долго пытался понять. :) В скрипте все объекты — все переменные, массивы, значения массивов и т.д. Следующий скрипт не работает кроссдоменно:
                                                                              // BOOM - access denied:
                                                                              var json = frames['script_to_google'].document.getElementById('json_from_google');
                                                                              // BOOM - access denied:
                                                                              var json =  frames['script_to_google'].var_json_from_google;
                                                                              

                                                                              Теперь надеюсь понятно…
                                                                                +1
                                                                                >frames['script_to_google']
                                                                                >frames
                                                                                >script
                                                                                >frames
                                                                                похоже все годы инфосека прошли впустую… я просто вытекаю из этого треда… пойду читать основы html…
                                                                                  0
                                                                                  Теперь да. Видимо frames['script_to_google'] говорит нам что-то… или нет? При чем тут это? Мы же про <script src?
                                                                                    –2
                                                                                    А результат выполнения <script src=... т.е. объект JSON нужно прочитать у нас на страничке…
                                                                                      +3
                                                                                      return.js:
                                                                                      var secret='taina';
                                                                                      zlo.html:
                                                                                      <script src=http://drugoi_host.com/return.js>alert(secret);</script>

                                                                                      Затем: http://zloi_host.com/zlo.htm

                                                                                      Вопрос: что покажет алерт c нашей странички (zloi_host.com)?

                                                                                      Варианты ответа:
                                                                                      1) taina
                                                                                      2) Ничего, потому что SOP ('drugoi_host.com' ne 'zloi_host.com').
                                                                                        –4
                                                                                        У вас не правильный вызов (не делайте так никогда) — правильно будет через второй вызов:
                                                                                        <script src="http://drugoi_host.com/return.js"></script>
                                                                                        <script>alert(secret);</script>
                                                                                        

                                                                                        И ответ тогда конечно 1) taina.
                                                                                        Но меня интересует вопрос, каким образом тогда передадутся куки от drugoi_host на drugoi_host.com? Еще интересней как вы собираетесь таким образом передавать параметры для генератора json (тот же token например)?
                                                                                          0
                                                                                          1 потому что так работает веб. куки передаются всегда тому сайту к которому они принадлежат. хотите вы этого или нет
                                                                                          2 токен это уже другая история, токен это не кука
                                                                                            –8
                                                                                            1 потому что так работает веб. куки передаются всегда тому сайту к которому они принадлежат. хотите вы этого или нет
                                                                                            Ага, но только тогда это крупная ошибка дизайна сайта — не ограничить куки на инклюд, подгружаемый через source… это что-то…
                                                                                            Либо токен, либо куки только на страницу (не на js)… По другому — ну никак.
                                                                                              +9
                                                                                              матчасть. читать.
                                                                                +3
                                                                                Коментом ниже я признал, что переопределять Аррай «таким вот образом» стало не возможным. И SOP тут не причем.
                                                                                <script src = просто грузит «текст», а затем интерпретирует его как JS в контексте того домена откуда пришел вызов, а не того домена ОТКУДА был загружен скрипт.

                                                                                stackoverflow.com/questions/1618993/alternative-to-cross-domain-javascripting

                                                                                  –1
                                                                                  Посмотрите еще раз сюда:
                                                                                  скипт будет выполнен, и куки будут нужные
                                                                                  Но JSON-то от гугля (из этого выполненного скрипта) вам нужно прочитать (интерпретировать) в своей страничке. Все эти объекты JSON не доступны нигде кроме скрипта от google.com.

                                                                                  А приведенный пример из оверфлоу вообще не получит cookie…
                                                                                    +3
                                                                                    Не важно откуда JSON. Когда мы юзаем script src. SOP не работает. Массив перешел к нам. Все баста.

                                                                                    Сейчас это не актуально, потому что необходимо решить задачу:

                                                                                    <script> [{"data":"value"}]; //Как мне прочитать data? </script>

                                                                                    Для этого был трюки с переопределением массива. Сейчас зафиксино. Но это не SOP. Объект уже у нас, он есть в памяти.
                                                                            +17
                                                                            Баян. ребята, это атака — JSON Hijacking, была блокирована в 2007/2008 производителями браузеров. Так что в данном случае это «страховка» на случай если изобретут новый способ перехвата и осталось «с тех времен» ибо хуже не будет. То что в статье на столько старо, что с тех пор, как переопределяли Array() уже был «изобретен» новый способ (после фикса 2007 надо было найти новый способ и его нашли):

                                                                            Object.prototype.__defineSetter__('Id', function(obj){alert(obj);});

                                                                            И он тоже уже пофиксен в фаерфокса версии >3.0.11…
                                                                            Все это история 8)
                                                                              0
                                                                              Спасибо. Добавлено, как примечание к топику.
                                                                              –4
                                                                              Гениально. Теперь многие разработчики вооружаться этой «фишкой» в копилку боевых навыков.
                                                                                +1
                                                                                Такая защита делается установкой в заголовок AJAX запроса токена (как в django, например — X-CSRFToken) и соответствующей проверкой на стороне сервера перед отдачей JSON'a.

                                                                                Стороннему сайту ни через <script> заголовок не передать, ни сам токен не извлечь. Или у гугла есть какие-то причины не использовать такой подход?
                                                                                  0
                                                                                  если бекенд юзает только сайт. а как API прикажете токен устанавливать?
                                                                                    0
                                                                                    просто передавать сессию не кукой а в параметре
                                                                                      0
                                                                                      ага, а как сделать параметр httponly? или хотите чтобы любая xss могла украсть сессию
                                                                                      0
                                                                                      Да, и правда, для API токен придется как-то получать. А через куки нельзя его протолкнуть?
                                                                                        0
                                                                                        Авторизовать клиентов API выдавая им токены?
                                                                                          0
                                                                                          Абсолютно аналогично. Как «сайт» получает токен, так и клиент для API его должен получить.
                                                                                        0
                                                                                        следующий вопрос — зачем facebook добавляет for(;;;); к ответам.
                                                                                          +5
                                                                                          То же самое. И Вконтакте так делает. Мода сезона 2007-2009 при работе с JSON.
                                                                                            –3
                                                                                            для вк мода, для фб думаю есть какие-то причины…
                                                                                              0
                                                                                              Причины те же. Что бы JSON объект не передался. <script>for(;;;); [{..secret object..}];</script> Массив не будет создан, а значит не будет Hijack атаки.
                                                                                                0
                                                                                                а, спасибо… долгое время не давало уснуть

                                                                                        Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                                                                        Самое читаемое